首页 > 编程 > C > 正文

C语言通讯录管理系统完整版

2020-01-26 13:45:55
字体:
来源:转载
供稿:网友

C语言实现了通讯录的录入信息、保存信息、插入、删除、排序、查找、单个显示等功能。。

完整的代码如下:

#include <stdio.h> #include <malloc.h> //得到指向大小为Size的内存区域的首字节的指针// #include <string.h> #include <stdlib.h> //标准库函数// #define NULL 0 #define LEN sizeof(struct address_list) //计算字节// int n; struct address_list {  char name[30];  //名字  char work[30];  //职业  char handset[30]; //手机  char email[30]; //电子邮件  char address[30]; //通讯地址  struct address_list *next; }; struct address_list *shifang(struct address_list *head); // 释放内存函数声明 //创建函数,不带头结点的链表 struct address_list *creat(void)   {  struct address_list *head,*p1,*p2;  char name[20];  n=0;  p1=(struct address_list *)malloc(LEN);  p2=p1; //强制内存转换  printf("请输入通讯录的内容!/n姓名输入为0时表示创建完毕!/n");  printf("请输入姓名:");  gets(name);  if(strcmp(name,"0")!=0)  {   strcpy(p1->name,name);   printf("请输入职业:");  gets(p1->work);   printf("请输入手机:");  gets(p1->handset);   printf("请输入电子邮件:"); gets(p1->email);   printf("请输入通讯地址:"); gets(p1->address);   head=NULL;   while(1)   {    n=n+1; //记录通讯录人数个数    if(n==1)     head=p1;    else     p2->next=p1;    p2=p1;    printf("请输入姓名:");    gets(name);    if(strcmp(name,"0")==0)    {     break;    }    else    {     p1=(struct address_list *)malloc(LEN);     strcpy(p1->name,name);     printf("请输入职业:"); gets(p1->work);     printf("请输入手机:"); gets(p1->handset);     printf("请输入电子邮件:"); gets(p1->email);     printf("请输入通讯地址:"); gets(p1->address);    }   }   p2->next=NULL;   return head;  }  else   return 0; } //输出函数 void print(struct address_list *head)  {  struct address_list *p;  if(head!=NULL)  {   p=head;   printf("本通讯录现在共有%d人:/n",n);   printf("---姓名-------职业--------手机-------Email-------通讯地址/n");   printf("==================================/n");   do   {    printf("== %s",p->name); printf("  ");    printf("%s",p->work); printf("  ");    printf("%s",p->handset); printf("  ");    printf("%s",p->email); printf("  ");    printf("%s",p->address); printf("  /n");    p=p->next;   }while(p!=NULL);   printf("==================================/n");  }  else   printf("通讯录为空,无法输出!/n"); } //增加函数 struct address_list *insert(struct address_list *head) {  struct address_list *p0,*p1,*p2;  char name[20];  p1=head;  printf("请输入增加的内容:/n");  printf("请输入姓名:"); gets(name);  if(strcmp(name,"0")==0)  {   printf("姓名不能为0,增加失败!/n");   return(head);  }  else  {   p0=(struct address_list *)malloc(LEN);   strcpy(p0->name,name);   printf("请输入职业:"); gets(p0->work);   printf("请输入手机:"); gets(p0->handset);   printf("请输入电子邮件:"); gets(p0->email);   printf("请输入通讯地址:"); gets(p0->address);   n=n+1;   if(head==NULL)   {    head=p0;    p0->next=NULL;    return head;   }   else   {    while(strcmp(p0->name,p1->name)>0&&(p1->next!=NULL))    {     p2=p1;     p1=p1->next;    }    if(strcmp(p0->name,p1->name)<0 || strcmp(p0->name,p1->name)==0)    {     if(head==p1)     {      head=p0;     }     else     {      p2->next=p0;     }     p0->next=p1;    }    else    {     p1->next=p0;     p0->next=NULL;    }    return head;   }  } } struct address_list* delete_txl(struct address_list *head) {  struct address_list *p,*q;  char name[30];  if(head==NULL)  {   printf("通讯录为空,无法显示!/n");   return head;  }  p=head;  printf("请输入需要删除的人的姓名:");  gets(name);  if(strcmp(head->name,name)==0)  {   head=head->next;   free(p);   printf("删除操作成功!/n");   return head;  }  else  {   q=head,p=head->next;   while(p!=NULL)   {    if(strcmp(p->name,name)==0)    {     q->next=p->next;     free(p);     printf("删除操作成功!/n");     return head;    }    p=p->next;    q=q->next;   }  } } //显示函数 struct address_list *display(struct address_list *head) {  struct address_list *p1,*p2;  char name[30];  int m;  if(head==NULL)  {   printf("通讯录为空,无法显示!/n");   return head;  }  p1=head;  m=0;  printf("请输入需要显示人的姓名:");  gets(name);  while(p1!=NULL)  {   while((strcmp(p1->name,name))!=0 && p1->next!=NULL)   {    p2=p1;    p1=p1->next;   }   if(strcmp(p1->name,name)==0)   {    m++;    printf("%s的通讯内容如下:/n",name);    printf("---姓名--------职业--------手机-------Email------通讯地址/n");    printf("==================================/n");    printf("== %s",p1->name);printf("  ");    printf("%s",p1->work);printf("  ");    printf("%s",p1->handset);printf("  ");    printf("%s",p1->email);printf("  ");    printf("%s",p1->address); printf("  /n");    printf("==================================/n");   }   p1=p1->next;  }  if(m==0)  {   printf("此人未在本通讯录中!/n");  }  return(head); }  //排序函数 struct address_list *paixu(struct address_list *head) {  struct address_list *p1,*p2;  int i,j;  struct address_list1  {   char name[30];   char work[30];   char handset[30];   char email[30];   char address[30];  };  struct address_list1 px[200];  struct address_list1 temp;  if(head==NULL)  {   printf("通讯录为空,无法排序!/n");   return(head);  }  p1=head;  for(i=0;i<n,p1!=NULL;i++)  {   strcpy(px[i].name,p1->name);   strcpy(px[i].work,p1->work);   strcpy(px[i].handset,p1->handset);   strcpy(px[i].email,p1->email);   strcpy(px[i].address,p1->address);   p2=p1;   p1=p1->next;  }  head=shifang(head);  for(j=0;j<n-1;j++)  {   for(i=j+1;i<n;i++)   {    if(strcmp(px[i].name,px[j].name)<0)    {     temp=px[i];     px[i]=px[j];     px[j]=temp;    }   }  }  p1=(struct address_list *)malloc(LEN);  p2=p1;  strcpy(p1->name,px[0].name);  strcpy(p1->work,px[0].work);  strcpy(p1->handset,px[0].handset);  strcpy(p1->email,px[0].email);  strcpy(p1->address,px[0].address);   head=p1;  for(i=1;i<n;i++)  {   p1=(struct address_list *)malloc(LEN);   strcpy(p1->name,px[i].name);   strcpy(p1->work,px[i].work);   strcpy(p1->handset,px[i].handset);   strcpy(p1->email,px[i].email);   strcpy(p1->address,px[i].address);   p2->next=p1;   p2=p1;  }  p2->next=NULL;  printf("按姓名排序后为:/n");  print(head);  return(head); } //姓名查找函数 struct address_list *search(struct address_list *head) {  struct address_list *p1,*p2;  int m;  char name[30];  if(head==NULL)  {   printf("通讯录为空,无法分类查找!/n");   return(head);  }  p1=head;  printf("********************/n");  printf("** 请输入需要查找的姓名 **/n");  printf("********************/n");  m=0;  gets(name);  while(p1!=NULL)  {   while(strcmp(p1->name,name)!=0&&p1->next!=NULL)   {    p2=p1;    p1=p1->next;   }   if(strcmp(p1->name,name)==0)   {    m++;    printf("你查找的内容是:/n");    printf("+++++++++++++++++++++++++++++++++++/n");    printf("++ %s  %s  %s  %s  %s/n",p1->name,p1->work,p1->handset,p1->email,p1->address);    printf("+++++++++++++++++++++++++++++++++++/n");   }   p1=p1->next;    if(m==0)   {    printf("此人未在本通讯录中!/n");   }   break;  }   return(head); }  //释放内存函数 struct address_list *shifang(struct address_list *head) {  struct address_list *p1;  while(head!=NULL)  {   p1=head;   head=head->next;   free(p1);  }  return(head); }  //文件写入函数 void save(struct address_list *head) {  FILE *fp;  struct address_list *p1;  char tong[30];  if(head==NULL)  {   printf("通讯录为空,无法存储!/n");   return;  }  printf("请输入保存后的文件名:");  gets(tong);  fp=fopen("(tong).txt","w");  if(fp==NULL)  {   printf("cannot open file/n");   return;  }  p1=head;  fprintf(fp,"姓名 职业  手机  Email  通讯地址/n");  for(;p1!=NULL;)  {   fprintf(fp,"%s  %s  %s  %s  %s/n",p1->name,p1->work,p1->handset,p1->email,p1->address);   p1=p1->next;  }  printf("保存完毕!/n");  fclose(fp); }  //文件读出函数 struct address_list *load(struct address_list *head) {  FILE *fp;  char tong[30];  struct address_list *p1,*p2;  printf("请输入要输出的文件名:");  gets(tong);  fp=fopen("(tong).txt","r");  if(fp==NULL)  {   printf("此通讯录名不存在,无法输出!/n");   return(head);  }  else  {   head=shifang(head);  }  p1=(struct address_list *)malloc(LEN);  fscanf(fp,"%s%s%s%s%s",&p1->name,&p1->work,&p1->handset,&p1->email,&p1->address);  if(feof(fp)!=0)  {   printf("文件为空,无法打开!/n");   return(head);  }  else  {   rewind(fp);   p2=p1;   head=p1;   n=0;   while(feof(fp)==0)   {    fscanf(fp,"%s%s%s%s%s",&p1->name,&p1->work,&p1->handset,&p1->email,&p1->address);    if(feof(fp)!=0)     break;    p2->next=p1;    p2=p1;    p1=(struct address_list *)malloc(LEN);    n=n+1;   }   p2->next=NULL;   p1=head;   head=head->next;   n=n-1;   free(p1);   print(head);   printf("打开完毕!/n");   return(head);  }  fclose(fp); }  //综合操作函数 struct address_list *menu(struct address_list *head) {  char num[10];  while(1)  {   printf("*********************/n");   printf("*** 1 姓名查找  ****/n");   printf("*** 2 单个显示  ****/n");   printf("*** 3 增加   ****/n");   printf("*** 4 退出   ****/n");   printf("*********************/n");   printf("请输入您选择的操作:");   gets(num);   switch(*num)   {   case '1':    {     head=search(head);       //姓名查找     print(head);    }    break;   case '2':    {     head=display(head);       //显示    }    break;   case '3':    {     head=insert(head);       //增加     print(head);    }    break;   case '4':    return head;   default:    printf("操作错误,此项不存在!/n");    break;   }   if(strcmp(num,"6")==0)    break;  }  return head; } //主函数 void main() {  struct address_list *head=NULL;  char num[10];  printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/n");  printf("*=*    程序说明    *=*/n");  printf("*=* 请及时保存创建完毕的通讯录内容! *=*/n");  printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/n");  while(1)  {   printf("************************/n");   printf("***  1 创建通讯录  ****/n");   printf("***  2 按名字排序  ****/n");   printf("***  3 综合操作  ****/n");   printf("***  4 保存   ****/n");   printf("***  5 打开   ****/n");   printf("***  6 删除   ****/n");   printf("***  7 退出   ****/n");   printf("************************/n");   printf("请输入您选择的操作:");   gets(num);   switch(*num)   {   case '1':    {     if(head==NULL)     {      head=creat();        //创建      print(head);     }     else     {      head=shifang(head);      head=creat();        //重新创建      print(head);     }    }    break;   case '2':    {     head=paixu(head);        //排序    }    break;   case '3':    {     head=menu(head);        //综合操作    }    break;   case '4':    {     save(head);         //文件保存     print(head);    }    break;   case '5':    {     head=load(head);        //文件输出    }    break;   case '6':    {     head=delete_txl(head);       //删除     print(head);    }    break;   case '7':    head=shifang(head);    break;   default:    printf("操作错误,此项不存在!/n");    break;   }   if(strcmp(num,"7")==0)    break;  } }

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选