1. 学生通讯录管理系统的设计与实现

1.1 问题的描述

学生通讯录管理系统是为了帮助老师、同学,或者其他一些需要使用通讯录的人员进行管理和分析的一种应用程序。

1.2 问题分析和任务定义

(1)输入数据建立通讯录;

(2)查询通讯录中满足要求的信息;

(3)插入新的通讯录信息;

(4)删除不需要的通讯录信息;

(5)查看所有的通讯录信息。

1.3 数据类型和系统设计

1存储结构设计

采用链表来存储“学生通讯信息”,其中链表结点有4个分量构成:通讯录成员学号、姓名、电话号码、指向下一个成员的指针。

2)系统功能设计

本系统设置了5个子功能菜单,5个子功能的设计描述如下:

① 建立通讯录系统。可以一次输入多个成员通讯录的信息,建立通讯录。该功能有由creatIncreLink() 函数实现。

② 插入通讯录记录。每次可以插入一个成员通讯录的信息,如果要连续插入多个成员通讯录信息必须多次选择该功能。该功能由insertYouXu() 函数实现。

③ 查询通讯录记录。可以按两种方式查询所需要的通讯录成员记录,一是按学号查询,而是按姓名查询。分别由searchNum() 和searchName() 函数实现。

④ 删除通讯记录。可以对通讯录中不再需要的信息进行删除。有三种删除方式,按序号进行删除,按学号进行删除和按姓名进行删除。分别由deleteElem() ,delNum() 和delName() 三个函数实现。

⑤ 显示通讯录记录。可以查看通讯录中所有通讯录成员记录。该功能由printList() 函数实现。

3)系统主界面的设计

为了实现学生通讯管理系统各功能的管理,设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本系统。本系统主控菜单运行界面如图1所示。

 

1 “学生通讯录管理系统”主菜单

1.4 编码实现

(1)链表结点类型的定义

typedef struct LNode

{ int number;

 double telenum;

 char name[20];

 struct LNode *next;

}LNode,*LinkList;

(2)建立链表的函数,主要用来建立通讯录。

LinkList creatIncreLink() //创建一个存放通讯录成员的非递减有序表,返回头结点地址

{ LinkList L=(LinkList)malloc(LEN);  //头结点

 L->next=NULL;

 LinkList p;

 int num=1;

 int number;

 double telenum;

 char name[20];

 printf("请输入学生学号、姓名和电话号码,建立通讯录,以'-1'为输入结束标志\n");

 printf("请输入学号 %d:",num);

 scanf("%d",&number);

 printf("请输入姓名 %d: ",num);

 char temp=getchar();

 gets(name);

 printf("请输入电话号码 %d:",num);

 scanf("%lf",&telenum);

 while (number>=0)

 {

  p=(LinkList)malloc(LEN); //新结点

  p->number=number;

  p->telenum=telenum;

  strcpy(p->name,name);

  insertYouXu(L,p);       //有序的插入新结点

  num++;

  printf("请输入学号 %d:",num);

     scanf("%d",&number);

     printf("请输入姓名 %d: ",num);

  temp=getchar();

     gets(name);

  printf("请输入电话号码 %d:",num);

     scanf("%lf",&telenum);

 } return(L);

}

(3)插入通讯记录

void insertYouXu(LinkList L,LinkList Elem)

{              //插入一个元素,使原有序表仍为有序

      LinkList p=L->next;

      while(p!=NULL && Elem->number>=p->number)

      {

             if(p->number==Elem->number)

             {                   printf("重复输入!!\n");return;

             }

             p=p->next;

      }         //确定Elem插入的位置

      if(p==NULL)

      {

             p=prior(L,p); Elem->next=NULL;p->next=Elem;

      }

      else       //若为空表,插到头结点之后

      {            p=prior(L,p); Elem->next=p->next; p->next=Elem;

      }

}

(4)按学号查询通讯录记录

int searchNum(LinkList L,int n)

{    // 按学号查找通讯者

 int flag=0;

 LinkList p=L->next;

 seat=1;

 if(L->next==NULL) printf("该链表中没有元素,查找失败\n");

 else  {

  while(p !=NULL)

  {

   if(p->number<=n)

    if(p->number==n)

      {       flag=1;

       printf("要查找的是第%d位通讯者:\n",seat);

       printf("                        学号: %d   姓名: %s   电话号码.:%.0f\n",p->number,p->name,p->telenum);

    }

   p=p->next;seat++;//!!!!

  }

 }

 return flag;

}

(5)按姓名查询通讯录记录

int searchName(LinkList L,char n[])

{    // 按姓名查找通讯者

 int flag=0;

 LinkList p=L->next;

 seat=1;

 if(L->next==NULL||L==NULL)

 printf("该通讯录中没有元素,查找失败\n");

 else  {

  while(p !=NULL)

  {

   if(!strcmp(p->name,n))

   {

    flag=1;

    printf("要查找的是第%d位通讯者:\n",seat);

    printf("                        Number: %d   Name: %s   TeleNo.:%.0f\n",p->number,p->name,p->telenum);

   }

   p=p->next;seat++;//!!!!!

  }

 } return flag;

}

(6)按序号进行删除,删除通讯录第i个元素

void deleteElem(LinkList L,int i)       //从通讯录中删除第i个元素

{

LinkList p=L;

 int j=0;

 while (p->next&&j<i-1)

 {

  p = p->next;j++;

 }

if(!(p->next))

{printf("第%d个元素删除失败\n",i);return ;}

  //判断i是否合法,i既不能大于元素的个数,也不能小于等于0

LinkList q = p->next;

p->next = q->next;

free(q); //释放删除的结点

}

(7)按学号删除通讯者

int delNum(LinkList L,int n)

{    // 按学号删除通讯者

 int flag=0;

 LinkList p=L->next;

 seat=1;

 if(L->next==NULL)

 printf("该链表中没有元素,删除失败\n");

 else  {

  while(p !=NULL)

  {

   if(p->number<=n)

   {

    if(p->number==n)

      {       flag=1;

       printf("%d ",p->number);

       p=p->next;

       deleteElem(L,seat);

    }

   }

   else {p=p->next;seat++;}

  }

  printf("被删除\n");

 }

 return flag;

}

(8)按姓名删除通讯者

int delName(LinkList L,char n[])

{    // 按姓名删除通讯者 

 int flag=0;

 LinkList p=L->next;

 seat=1;

 if(L->next==NULL)

 printf("该链表中没有元素,查找失败\n");

 else {

  while(p !=NULL)

  {

   if(!strcmp(p->name,n))

   {

    flag=1;

    printf("%s ",p->name);

    p=p->next;

    deleteElem(L,seat);

   }

   else {p=p->next;seat++;}

  }

  if(flag)printf("被删除\n");

 } return flag;

}

(9)显示通讯录

void printList(LinkList L)

{    // 打印头结点地址为L的通讯录

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

 printf("               学号       姓名     电话号码\n");

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

 LinkList p=L;

 int n=1;

 if(L==NULL||L->next==NULL) printf("该通讯录中没有元素\n");

 else

  while(p->next !=NULL)

  {

   printf("          %2d   %-9d",n,p->next->number);

   printf("    %-5s  %.0f\n",p->next->name,p->next->telenum);

   p=p->next;

   n++;

  }

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

 return ;

}

(10)主菜单,main函数

void main(){

 system("color 1f");  

 LinkList L=NULL;

 printf("\n           ***************** ^@^欢迎使用通讯录系统***********\n");

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

 printf("           *               2 插入通讯记录                   *\n");

 printf("           *               3 查询通讯记录                   *\n");

 printf("           *               4 删除通讯记录                   *\n");

 printf("           *               5 显示通讯录信息                 *\n");

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

 printf("           **************** ^@^欢迎使用通讯录系统************\n");

 int flag=0;

 int menu;

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

 scanf("%d",&menu);

 while(menu!=0)

 {

 switch(menu) {

  case 1:       {

    L=creatIncreLink();

    printf("建立通讯录:");

    printList(L);

    flag=1;

    break;

        }

  case 2:       {          if(flag==1)

               {int number,telenum;

           char name[20];

           printf("请输入通讯者的学号和姓名:\n");

           printf("请输入学号: ");

           scanf("%d",&number);

           printf("请输入姓名: ");

           char temp=getchar();

           gets(name);

           printf("请输入电话号码: ");

           scanf("%d",&telenum);

           LinkList p=(LinkList)malloc(LEN); //新结点

           p->number=number;

           strcpy(p->name,name);

           p->telenum=telenum;

           insertYouXu(L,p);       //有序的插入新结点

           printf("插入后:");

           printList(L);

               }

          else printf("\nERROR: 通讯录还没有建立,请先建立通讯录\n");

   break;

        }

  case 3:{    int way,n;

          char na[20];

          int s;

          if(L!=NULL)

               {

if(flag) {

                             printf("选择查找方式:\n");

                  printf("               1.按学号   2.按姓名");

                  scanf("%d",&way);

                  if(way==1)

                             {

                                    printf("\n请输入学号:");

                      scanf("%d",&n);

                      s=searchNum(L,n);

                      if(s==0) printf("无此通讯者,查找失败!\n");

                             }

                             else if(way==2)

                             {        printf("\n请输入姓名:");

                                    char temp=getchar();

                                    gets(na);

                                    s=searchName(L,na);

                                    if(s==0) printf("无此通讯者,查找失败!\n");

                             }

                             else printf("通讯录中无记录!\n");

                      }

                      break;

               }

               else printf("通讯录中无记录!\n");break;

        }

  case 4:{

               int way;

               printf("选择删除方式:1.按序号  2. 按学号  3.按姓名 \n");

               scanf("%d",&way);

               if(way==1)

               {

                      int n;

                      printf("请输入通讯录序号: ");

                      scanf("%d",&n);

                      printf("删除后:\n");

                      deleteElem(L,n);

                      printList(L);

               }

               else if(way==2)

               {

                      int n,f;

                      printf("请输入学号: ");

                      scanf("%d",&n);

                      f=delNum(L,n);

                      if(f!=0)

                      {

                             printf("删除后:\n");

                             printList(L);

                      }

                      else printf("无该学号,删除失败!\n");

               }

               else if(way==3)

               {

                      char na[20];

                      int f;

                      printf("\n请输入姓名:");

                      char temp=getchar();

                      gets(na);

                      f=delName(L,na);

                      if(f!=0)

                      {

                             printf("删除后:\n");

                             printList(L);

                      }

                      else printf("无该学号,删除失败!\n");

               }

               else printf("ERROR!!\n");

               break;

        }

  case 5: {

               printf("当前通讯录内容如下:\n");

               printList(L);

               break;

        }

  case 0: exit(0);

  default:  printf("\n没有此功能,重新输入\n");

 }

 printf("选择功能:");

 scanf("%d",&menu);

}

}

1.5 测试结果

1.建立通讯录

 

2.插入通讯记录

 

3.查询通讯记录

 

4.删除通讯记录

 

5.显示通讯录信息

 

6.退出管理系统

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐