基于Linux的通讯录设计(链表实现)

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<sys/types.h>
  5. #include<sys/stat.h>
  6. #include<unistd.h>
  7. #include<fcntl.h>
  8. #define N 15
  9. #define FALSE 0
  10. #define TURE 1
  11. typedef char Elemtype;
  12. typedef int Number;
  13. typedef int Status;
  14. typedef struct Node
  15. {
  16.     Number data;
  17.     Elemtype nam[N];
  18.     Elemtype num[N];
  19.     struct Node *next;
  20. }Node,*Linklist;
  21. Status Iinklist(Linklist *L)          //初始化
  22. {
  23.     Node *p=(Node *)malloc(sizeof(Node));  //申请一个头结点
  24.     if(p==NULL)
  25.     {
  26.         printf("      初始化失败!\n");
  27.         return FALSE;
  28.     }
  29.     *L=p;
  30.     (*L)->data=0;
  31.     int i;
  32.     for(i=0;i<N;i++)
  33.     {
  34.         (*L)->nam[i]=0;
  35.         (*L)->num[i]=0;
  36.     }
  37.     (*L)->next=NULL;
  38.     return TURE;
  39. }
  40. Status Insert(Linklist *L,Elemtype name[N],Elemtype number[N])    //新建联系人
  41. {
  42.     Node *p=(Node *)malloc(sizeof(Node));   //新申请的结构体
  43.     Linklist tmp=*L;                           //如果用*L对p不断赋值,头结点就找不到了
  44.     if(p==NULL)
  45.     {
  46.         printf("      通信录空间已满!\n");
  47.         return FALSE;
  48.     }
  49.     (*L)->data++;
  50.     strcpy(p->nam, name);
  51.     strcpy(p->num, number);
  52.     p->next=tmp->next;
  53.     tmp->next=p;
  54.     return TURE;
  55. }
  56. Status Delete(Linklist *L,Elemtype name[N])      //删除联系人
  57. {
  58.     Linklist tmp=(*L);
  59.     Linklist tmp2;
  60.     int i=0;
  61.     if((*L)->next==NULL)
  62.     {
  63.         printf("      通讯录为空!\n");
  64.         return FALSE;
  65.     }
  66.     while(i<(*L)->data&&tmp->next!=NULL)
  67.     {
  68.         i++;
  69.          if(strcmp(tmp->next->nam,name)==0)
  70.         {
  71.             tmp2=tmp->next;
  72.             name=tmp2->nam;
  73.             tmp->next=tmp2->next;
  74.             free(tmp2);
  75.             (*L)->data--;
  76.             return TURE;
  77.         }
  78.         tmp=tmp->next;
  79.     }
  80.         printf("      输入联系人姓名有误!\n");
  81.         return FALSE;
  82. }
  83. Status Get(Linklist *L,Elemtype name[N])   //查找联系人
  84. {
  85.     Linklist tmp=*L;
  86.     if(((*L)->data)==0)
  87.     {
  88.         printf("通讯录为空\n");
  89.         return FALSE;
  90.     }
  91.     printf("      通讯录中共有%d个联系人.\n",(*L)->data);
  92.     printf("      请输入要查找的联系人的姓名:");
  93.     scanf("%s",name);
  94.     tmp=tmp->next;
  95.     while(tmp!=NULL)
  96.     {
  97.          if(strcmp(tmp->nam,name)==0)
  98.          {
  99.             printf("      要查找的联系人的电话号码为: %s",tmp->num);
  100.             return TURE;
  101.          }
  102.          tmp=tmp->next;
  103.     }
  104.         printf("      查无此人!\n");
  105.         return FALSE;
  106. }
  107. Status Print(Linklist *L)        //查看全部通讯录
  108. {
  109.     if((*L)->data==0)
  110.     {
  111.         printf("      通讯录为空!\n");
  112.         return FALSE;
  113.     }
  114.     Linklist tmp=*L;
  115.     tmp=tmp->next;
  116.     while(tmp!=NULL)
  117.     {
  118.         printf("      姓名:%s",tmp->nam);
  119.         printf("   电话:%s\n",tmp->num);
  120.         tmp=tmp->next;
  121.     }
  122.     return TURE;
  123. }
  124. Status Rank(Linklist *L)                //按首字母排序
  125. {
  126.     Linklist tmp=(*L)->next;
  127.     
  128.     if((*L)==NULL)
  129.     {
  130.         printf("      通讯录为空!\n");
  131.         return FALSE;
  132.     }
  133.     int i=0,j;
  134.     Linklist a[50];
  135.     int flag=FALSE;
  136.     while(tmp!=NULL)
  137.     {
  138.         a[i]=tmp;
  139.         tmp=tmp->next;
  140.         i++;
  141.     }
  142.     for(i=0;i<((*L)->data)-1;i++)
  143.     {
  144.         flag=TURE;
  145.         for(j=0;j<(((*L)->data)-1-i);j++)
  146.         {
  147.             if(strcmp(a[j]->nam,a[j+1]->nam)>0)
  148.             {
  149.                 Linklist tmp2;
  150.                 tmp2=a[j];
  151.                 a[j]=a[j+1];
  152.                 a[j+1]=tmp2;
  153.             }
  154.                 flag=FALSE;
  155.             }
  156.         }
  157.         for(i=0;i<(*L)->data;i++)
  158.         {
  159.             printf("      姓名:%s",a[i]->nam);
  160.             printf("   电话:%s\n",a[i]->num);
  161.         }
  162.     }
  163. Status Mod(Linklist *L,Elemtype name[N],Elemtype number [N]) //修改联系人信息
  164. {
  165.     printf("      请输入要修改的联系人姓名: ");
  166.     scanf("%s",name);
  167.     Linklist tmp=*L;
  168.     tmp=tmp->next;
  169.     while(tmp!=NULL)
  170.     {
  171.         if(strcmp(tmp->nam,name)==0)
  172.         {
  173.             printf("      请输入新的联系人号码: ");
  174.             scanf("%s",number);
  175.             strcpy(tmp->num,number);
  176.             printf("      修改成功!\n");
  177.             return TURE;
  178.         }
  179.         tmp=tmp->next;
  180.     }
  181.         printf("      查无此人!\n");
  182.         return FALSE;
  183. }
  184. Status Preserve(Linklist L)                   //保存联系人信息
  185. {
  186.     int fd=open("phone.txt",O_RDWR);
  187.     Linklist tmp=L;
  188.     if(fd==-1)
  189.     {
  190.         perror("open");
  191.         return 1;
  192.     }
  193.     int cal;
  194.     tmp=tmp->next;
  195.     while(tmp!=NULL)
  196.     {
  197.         cal=write(fd,tmp,sizeof(Node));
  198.         tmp=tmp->next;
  199.     }
  200.     close(fd);
  201.     return 2;
  202. }
  203. int main()
  204. {
  205.     Linklist Ltop;
  206.     Iinklist(&Ltop);
  207.     Node a;
  208.     int cal2=Iinklist(&Ltop);
  209.     Elemtype name[N];
  210.     Elemtype number[N];
  211.     int fd2=open("phone.txt",O_CREAT|O_RDWR,0777);
  212.     if(fd2==-1)
  213.     {
  214.         perror("open");
  215.         return 1;
  216.     }
  217.     while(read(fd2,&a,sizeof(Node))!=0)
  218.     {
  219.         Insert(&Ltop,a.nam,a.num);
  220.     }
  221.     close(fd2);
  222.     printf("\t已存联系人信息\n");
  223.     printf("      ******************\n");
  224.     Print(&Ltop);
  225.     printf("      ******************\n");    
  226.     while(1)
  227.     {
  228.         printf("\t\t\t1.新建联系人\n");
  229.         printf("\t\t\t2.删除联系人\n");
  230.         printf("\t\t\t3.查找联系人\n");
  231.         printf("\t\t\t4.查看全部通讯录\n");
  232.         printf("\t\t\t5.按首字母排序\n");
  233.         printf("\t\t\t6.修改联系人号码\n");
  234.         printf("\t\t\t0.保存并退出程序\n");
  235.     int i;
  236.     scanf("%d",&i);
  237.     switch(i)
  238.     {
  239.         case 1:
  240.             printf("      请输入新建联系人的姓名:");
  241.             scanf("%s",name);
  242.             printf("      请输入新建联系人电话号码: ");
  243.             scanf("%s",number);
  244.             Insert(&Ltop,name,number);
  245.             break;
  246.         case 2:
  247.             printf("      请输入要删除的联系人姓名:");
  248.             scanf("%s",name);
  249.             if(Delete(&Ltop,name)==1)
  250.             printf("      已删除联系人!\n");
  251.             break;
  252.         case 3:
  253.             Get(&Ltop,name);
  254.             break;
  255.         case 4:
  256.             Print(&Ltop);
  257.             break;
  258.         case 5:
  259.             Rank(&Ltop);
  260.             break;
  261.         case 6:
  262.             Mod(&Ltop,name,number);
  263.             break;
  264.         case 0:
  265.             Preserve(Ltop);
  266.             return 0;
  267.             break;
  268.         default:
  269.             printf("       输入选项有误!\n");
  270.             return FALSE;
  271.             break;
  272.     }
  273.     }
  274.     return 0;
  275. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值