1.个人项目 Individual Project

https://github.com/sunlitao

 

一. 实验1通讯录管理系统

通讯录中的联系人包含以下信息项:姓名、手机、办公电话、家庭电话、电子邮箱、所在省市、工作单位、家庭住址,群组分类(亲属、同事、同学、朋友、其他)

系统的主要功能包括:

1. 输入联系人的信息,要求:至少输入10个联系人的数据,且注意数据的多样性。

2. 按姓名对联系人信息进行排序,并将排序后信息存放到一个文本文件中。

3. 添加联系人的信息,在已经存在的通讯录文件中添加若干个联系人。要求:添加后仍按联系人的姓名排序,并保存至原文件。

4. 删除联系人的信息,输入一个姓名,若通讯录中有该联系人的信息,则删除该联系人,否则输出提示信息,并提示用户选择是否继续进行删除操作。

5. 修改联系人的信息,输入一个姓名,根据具体需要修改该联系人的某一项信息,将修改后的信息重新保存到通讯录文件中,并提示用户选择是否继续进行修改操作。

6. 按不同条件对通讯录进行查询操作,输出满足条件的联系人的信息。

(1) 按姓名查询,包括精确查询(输入全名),模糊查询(输入姓)

(2) 按手机号码查询,输入全部号码或号码位段(如输入130133139等);

(3) 按群组分类查询,输入分类名称,输出该群组的全部联系人信息。

7. 输出联系人的信息,按一定格式输出信息,保证信息排列整齐美观。

程序如下:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

typedef struct{

      char num[5];

      char name[9];

      char sex[3];

      char phone[13];

      char addr[31];

}DataType;

 

typedef struct node{

      DataType data;

      struct node * next;

}ListNode;

typedef ListNode * LinkList;

LinkList head;

ListNode *p;

int menu_select();

LinkList CreateList(void);

void InsertNode(LinkList head,ListNode *p);

ListNode * ListFind(LinkList head);

void DelNode(LinkList head);

void PrintList(LinkList head);

int main()

{

      for( ; ; ){

           switch(menu_select())

           {

           case 1:

                 printf("***********************************\n");

                 printf("*    通 讯 录 链 表 的 建 立       *\n");

              printf("***********************************\n");

                 head=CreateList();

                 break;

           case 2:

              printf("***********************************\n");

            printf("*   通 讯 者 信 息 的 添 加        *\n");

                 printf("***********************************\n");

                 printf("编号(4) 姓名(8) 性别 电话(11) 地址(31)\n");

              printf("***********************************\n");

                 p=(ListNode *)malloc(sizeof(ListNode));

                  scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,

                             p->data.phone,p->data.addr);

                  InsertNode(head,p);

                 break;

        case 3:

            printf("***********************************\n");

                 printf("*    通 讯 录 信 息 的 查 询       *\n");

            printf("***********************************\n");

               p=ListFind(head);

                 if(p!=NULL){

                      printf("编号 姓 名 性别 联系电话 地 址\n");

                      printf("-------------------------------------\n");

                      printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,

                             p->data.phone,p->data.addr);

                      printf("-------------------------------------\n");

                 }

                 else

                      printf("没查到要查询的通讯者!\n");

                 break;

        case 4:

            printf("***********************************\n");

                 printf("*    通 讯 录 信 息 的 删 除       *\n");

            printf("***********************************\n");

                 DelNode(head);

                 break;

 

        case 5:

            printf("***********************************\n");

                 printf("*    通 讯 录 链 表 的 输 出       *\n");

            printf("***********************************\n");

                 PrintList(head);

                 break;

        case 0:

                 printf("\t    再   见!  \n");

                 return 0;

           }

      }

}

 

int menu_select()

{

      int sn;

      printf("       通讯录管理系统\n");

    printf("==============================\n");

      printf("     1.通讯录链表的建立\n");

      printf("     2.通讯者结点的插入\n");

      printf("     3.通讯者结点的查询\n");

      printf("     4.通讯者结点的删除\n");

      printf("     5.通讯录链表的输出\n");

      printf("     0.退 出 管 理 系统\n");

      printf("==============================\n");

      printf("        请 选 择0-5:");

      for( ; ; )

      {

           scanf("%d",&sn);

           if(sn<0 || sn>5)

                 printf("\n\t输出错误,重选0-5: ");

           else

                 break;

      }

      return sn;

}

 

LinkList CreateList(void)

{

      LinkList head=(ListNode *)malloc(sizeof(ListNode));

      ListNode *p,*rear;

      int flag=0;

      rear=head;

      while(flag==0)

      { p=(ListNode *)malloc(sizeof(ListNode));

        printf("编号(4) 姓名(8) 性别 电话(11) 地址(31)\n");

        printf("---------------------------------------------------\n");

        scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,

                             p->data.phone,p->data.addr);

        rear->next=p;

        rear=p;

        printf("结束建表吗? (1/0):");

        scanf("%d",&flag);

      }

      rear->next=NULL;

      return head;

}

 

void InsertNode(LinkList  head,ListNode *p)

{

      ListNode *p1,*p2;

      p1=head;

      p2=p1->next;

      while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0)

      {

           p1=p2;

           p2=p2->next;

      }

      p1->next=p;

      p->next=p2;

}

 

ListNode * ListFind(LinkList head)

{

      ListNode *p;

      char num[5];

      char name[9];

      int xz;

      printf("=====================\n");

      printf("  1.按编号查询       \n");

      printf("  2.按姓名查询       \n");

      printf("=====================\n");

      printf("     请选择 :      ");

      p=head->next;

      scanf("%d",&xz);

      if(xz==1) {

           printf("请输入要查询者的编号:  ");

           scanf("%s",num);

           while(p && strcmp(p->data.num,num)<0)

                 p=p->next;

           if(p==NULL || strcmp(p->data.num,num)>0)

                 p=NULL;

      }

      else

           if(xz==2) {

                 printf("请输入要查询者的姓名: ");

                 scanf("%s",name);

                 while(p && strcmp(p->data.name,name)!=0)

                      p=p->next;

           }

           return p;

}

 

void DelNode(LinkList head)

{

      int  jx;

      ListNode *p,*q;

      p=ListFind(head);

      if(p==NULL) {

           printf("没有查到要删除的通讯者!\n");

           return;

      }

      printf("真的要删除该结点吗?(1/0): ");

      scanf("%d",&jx);

      if(jx==1)

      {

          q=head;

           while(q!=NULL && q->next!=p)

                 {q=q->next; }

            p=q->next; 

           q->next=p->next;

           free(p);

           return;

           printf("通讯者已被删除!\n");

          

      }

}

void PrintList(LinkList head)

{

      ListNode *p;

      p=head->next;

      printf("编号 姓 名 性别 联系电话 地 址\n");

      printf("---------------------------------------\n");

      while(p!=NULL)

      {

           printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,

                             p->data.phone,p->data.addr);

           printf("----------------------------------------------------\n");

           p=p->next;

      }

}

                        一  通讯表的建立

 

 

 

二  通讯者结点的插入

在次添加一名通讯者信息

 

 

 

三  通讯者节点的查询

 

 

 

 

①     按姓名查询张三

 

 

 

四 通讯者节点的删除

 

五   通讯录链表的输出

 

 

六  管理系统的退出

 

 

总结和心得

在这个程序中,了解到往往拿到一个问题是要先分析总体框架并分为小块进行,注意指针与链表的选用和比较哪种较优,使程序更为简单,效率更高,更加要了解那些函数有着怎样的功能,怎么运用是很重要的,从程序中也知道要学习的东西还有很多很多。

   设计过程中出现的问题,当输入相同序号时没有提出重复提示,改进


posted @ 2015-04-28 14:24  若即若离233  阅读(179)  评论(6编辑  收藏  举报