我发现,失恋的好处就是,作业终于能自己写完了。。。好吧,写得很烂,很不精简,将就着看吧。

test3.cpp

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. typedef int status;
  5. #define TURE 1
  6. #define FALSE 0
  7. #define OK 1
  8. #define ERROR 0
  9. #define OVERFLOW -2
  10. #define INFEASIBLE -1
  11. #define MAXSIZE 100
  12. typedef struct{
  13.     char name[20],tel[20],email[20];
  14. }elemtype;
  15. typedef struct{
  16.     elemtype *seq;
  17.     int lenght;
  18. }Seqlist;
  19. struct node{
  20.     elemtype date;
  21.     struct node *next = NULL;
  22. };
  23. #include”test3_link.h”
  24. #include”test3_Seq.h”
  25. int main()
  26. {
  27.     int option;
  28.     status sta;
  29.     Seqlist L;
  30.     L.lenght = 0;
  31.     struct node link;
  32.     struct node* s;
  33.     InitAddressBook(L);//初始化通讯录
  34.     InitRecover(link);//初始化回收站 
  35.     while(1)
  36.     {
  37.         printf(“\n==============通讯录基本操作菜单==============\n0.退出程序\t\t1.显示联系人\n2.插入联系人\t\t3.删除联系人\n4.恢复联系人\t\t5.修改联系人\n6.查找通讯录\t\t7.显示回收站\n8.查找回收站\t\t9.彻底删除联系人\n10.清空回收站\n\n你选择的功能是:”);
  38.         scanf(“%d”,&option);
  39.         if(option == 0) break;
  40.         switch (option)
  41.         {
  42.             case 1:
  43.                 BrowseAddressBook(L);
  44.                 break;
  45.             case 2:
  46.                 sta = InsertAddressBook(L);
  47.                 if(sta > 0) printf(“插入成功!\n”);
  48.                 else printf(“插入失败!\n”);
  49.                 break;
  50.             case 3:
  51.                 sta = DeleteAddressBook(L,link);
  52.                 if(sta > 0) printf(“删除成功,你可以在回收站中恢复该联系人\n”);
  53.                 else printf(“删除失败!\n”);
  54.                 break;
  55.             case 4:
  56.                 sta = RecoveryRecover(L,link);
  57.                 if(sta > 0) printf(“恢复成功!\n”);
  58.                 else printf(“无法恢复!\n”);
  59.                 break;
  60.             case 5:
  61.                 sta = ChangeAddressBook(L);
  62.                 if(sta > 0) printf(“修改成功!\n”);
  63.                 else printf(“修改失败!\n”);
  64.                 break;
  65.             case 6:
  66.                 SearchAddressBook(L);
  67.                 break;
  68.             case 7:
  69.                 BrowseRecover(link);
  70.                 break;
  71.             case 8:
  72.                 sta = SearchRecover(link,s);
  73.                 if(sta > 0) printf(“%s\t\t%s\t\t%s\n查找完成!\n”,s->date.name,s->date.tel,s->date.email);
  74.                 else printf(“查找无法完成!\n”);
  75.                 break;
  76.             case 9:
  77.                 //struct node* s;
  78.                 sta = SearchRecover(link,s);
  79.                 if(sta > 0)
  80.                 {
  81.                     sta = DeleteRecover(link,s);
  82.                     //printf(“1”);
  83.                     if(sta > 0) printf(“小李飞刀成绝响,人世不见楚留香,彻底删除完成!\n”);
  84.                 }
  85.                 if(sta <= 0) printf(“彻底删除无法完成!\n”);
  86.                 break;
  87.             case 10:
  88.                 EmptyRecover(link);
  89.                 break;
  90.             default:
  91.                 printf(“你的输入不合法,请重新输入!\n”);
  92.                 break;
  93.         }
  94.     }
  95.     SaveAddressBook(L);//保存通讯录到本地文件 
  96.     SaveLinkList(link);//保存回收站到本地文件 
  97. }

test3_Seq.h

  1. status InitAddressBook(Seqlist &L)
  2. {
  3.     L.seq = (elemtype *)malloc(sizeof(elemtype)*MAXSIZE);
  4.     FILE *fp;
  5.     fp=fopen(“AddressBook.txt”,“r”);
  6.     if (fp==NULL)
  7.     {
  8.         return INFEASIBLE;
  9.     }
  10.     elemtype x;
  11.     //printf(“%d\n”,L.lenght);
  12.     while(!feof(fp))
  13.     {
  14.         fscanf(fp,“%s %s %s”,x.name,x.tel,x.email);
  15.         L.seq[L.lenght++] = x;
  16.         //printf(“%d\n”,L.lenght);
  17.     }
  18.     fclose(fp);
  19.     return OK;
  20. }
  21. status BrowseAddressBook(Seqlist L)
  22. {
  23.     if(L.lenght==0)
  24.     {
  25.         printf(“通讯录内容为空!”);
  26.         return ERROR;
  27.     }
  28.     else printf(“Num\t\tName\t\tTel\t\t\tEmail\n”);
  29.     for(int i = 0;i<L.lenght;i++)
  30.     {
  31.         printf(“%d\t\t%s\t\t%s\t\t%s\n”,i,L.seq[i].name,L.seq[i].tel,L.seq[i].email);
  32.     }
  33.     return OK;
  34. }
  35. status InsertAddressBook(Seqlist &L)
  36. {
  37.     int P,i;
  38.     printf(“请输入你要插入的位置:”);
  39.     scanf(“%d”,&P);
  40.     if ( L.lenght == MAXSIZE-1) {
  41.         printf(“表满,”);
  42.         return OVERFLOW;
  43.     }
  44.     if ( P<0 || P>L.lenght ) {
  45.         printf(“位置不合法,”);
  46.         return INFEASIBLE;
  47.     }
  48.     printf(“请输入你要插入的信息:”);
  49.     elemtype x;
  50.     scanf(“%s %s %s”,x.name,x.tel,x.email);
  51.     for( i=L.lenght-1; i>=P; i– )
  52.         L.seq[i+1] = L.seq[i];
  53.     L.seq[P] = x;
  54.     L.lenght++;
  55.     return OK;
  56. }
  57. status DeleteAddressBook(Seqlist &L,node &link)
  58. {
  59.     int P,i;
  60.     printf(“请输入你要删除的位置:”);
  61.     scanf(“%d”,&P);
  62.     if ( P<0 || P>=L.lenght ){
  63.         printf(“位置不合法,”);
  64.         return INFEASIBLE;
  65.     }
  66.     elemtype x;
  67.     x = L.seq[P];
  68.     InsertRecover(link,x);
  69.     for(i = P;i < L.lenght-1;i++)
  70.     {
  71.         L.seq[i] = L.seq[i+1];
  72.     }
  73.     L.lenght–;
  74.     return OK;
  75. }
  76. status ChangeAddressBook(Seqlist &L)
  77. {
  78.     int P,i;
  79.     printf(“请输入你要修改的位置:”);
  80.     scanf(“%d”,&P);
  81.     if ( P<0 || P>=L.lenght ){
  82.         printf(“位置不合法,”);
  83.         return INFEASIBLE;
  84.     }
  85.     else
  86.     {
  87.         printf(“0.NAME  1.TEL  2.EMAIL\n请输入你要修改的信息选项:”);
  88.         scanf(“%d”,&i);
  89.         //getchar();
  90.         switch (i)
  91.         {
  92.             case 0:
  93.                 scanf(“%s”,L.seq[P].name);
  94.                 break;
  95.             case 1:
  96.                 scanf(“%s”,L.seq[P].tel);
  97.                 break;
  98.             case 2:
  99.                 scanf(“%s”,L.seq[P].tel);
  100.                 break;
  101.             default:
  102.                 printf(“没有该选项,”);
  103.                 return INFEASIBLE;
  104.         }
  105.         //printf(“%s %s %s”,L.seq[P].name,L.seq[P].tel,L.seq[P].email);
  106.         return OK;
  107.     }
  108. }
  109. status SearchAddressBook(Seqlist &L)
  110. {
  111.     char name[20];
  112.     if(L.lenght==0)
  113.     {
  114.         printf(“通讯录内容为空!”);
  115.         return ERROR;
  116.     }
  117.     else
  118.     {
  119.         printf(“请输入你要查询的名字:”);
  120.         scanf(“%s”,name);
  121.         for(int i = 0;i<L.lenght;i++)
  122.         {
  123.             if(strcmp(name,L.seq[i].name)==0)
  124.             {
  125.                 printf(“%d\t\t%s\t\t%s\t\t%s\n查找完成!\n”,i,L.seq[i].name,L.seq[i].tel,L.seq[i].email);
  126.                 return OK;
  127.             }
  128.         }
  129.         printf(“通讯录未录入该姓名”);
  130.         return FALSE;
  131.     }
  132. }
  133. void SaveAddressBook(Seqlist L)
  134. {
  135.     FILE *fp;
  136.     fp=fopen(“AddressBook.txt”,“w”);
  137.     if (fp==NULL)
  138.     {
  139.         exit(1);
  140.     }
  141.     for (int i=0;i<L.lenght-1;i++)
  142.         fprintf(fp,“%s %s %s\n”,L.seq[i].name,L.seq[i].tel,L.seq[i].email);
  143.     fprintf(fp,”%s %s %s”,L.seq[L.lenght-1].name,L.seq[L.lenght-1].tel,L.seq[L.lenght-1].email);
  144.     fclose(fp);
  145. }

test3_link.h

  1. status InitRecover(node &link)
  2. {
  3.     FILE *fp;
  4.     fp=fopen(“Recover.txt”,“r”);
  5.     if (fp==NULL)
  6.     {
  7.         return ERROR;
  8.     }
  9.     elemtype x;
  10.     struct node * temp=NULL;
  11.     while(!feof(fp))
  12.     {
  13.         if (fscanf(fp,“%s %s %s”,x.name,x.tel,x.email)!=EOF)
  14.             {
  15.                 temp = (node *)malloc(sizeof(node));
  16.                 temp->date = x;
  17.                 temp->next = link.next;
  18.                 link.next = temp;
  19.                 //printf(“%s %s %s\n”,x.name,x.tel,x.email);
  20.                 //printf(“%s %s %s\n”,temp->date.name,temp->date.tel,temp->date.email);
  21.             }
  22.     }
  23.     fclose(fp);
  24.     /*struct node * test = link.next;
  25.     while(test != NULL)
  26.     {
  27.         printf(“%s %s %s\n”,test->date.name,test->date.tel,test->date.email);
  28.         test = test->next;
  29.     }*/
  30.  }
  31. status InsertRecover(node &link,elemtype x)
  32.  {
  33.     //printf(“%s %s %s\n”,x.name,x.tel,x.email);
  34.     struct node *add=NULL;
  35.     add = (node *)malloc(sizeof(node));
  36.     add->date = x;
  37.     add->next = link.next;
  38.     link.next = add;
  39.     //printf(“%s %s %s\n”,add->date.name,add->date.tel,add->date.email);
  40.  }
  41. status BrowseRecover(node &link)
  42. {
  43.     if(link.next==NULL)
  44.     {
  45.         printf(“查询的内容为空!”);
  46.         return ERROR;
  47.     }
  48.     else printf(“Name\t\tTel\t\t\tEmail\n”);
  49.     struct node * test = link.next;
  50.     while(test != NULL)
  51.     {
  52.         printf(“%s\t\t%s\t\t%s\n”,test->date.name,test->date.tel,test->date.email);
  53.         test = test->next;
  54.     }
  55.     return OK;
  56. }
  57. status SearchRecover(node link,struct node* &s)
  58. {
  59.     s = link.next;
  60.     if(s == NULL)
  61.     {
  62.         printf(“回收站为空,”);
  63.         return FALSE;
  64.     }
  65.     printf(“请输入联系人姓名:”);
  66.     char name[20];
  67.     scanf(“%s”,name);
  68.     //printf(“%s”,name);
  69.     while(s!=NULL)
  70.     {
  71.         if(strcmp(name,s->date.name)==0)return TURE;
  72.         else s = s->next;
  73.     }
  74.     printf(“回收站未收录该姓名,”);
  75.     return FALSE;
  76. }
  77. DeleteRecover(struct node &link,struct node* &s)
  78. {
  79.     node *temp = &link;
  80.     if(link.next == s)
  81.     {
  82.         link.next = s->next;
  83.         free(s);
  84.         return OK;
  85.     }
  86.     //printf(“%s %s %s”,s->next->date.name,s->next->date.tel,s->next->date.email);
  87.     while(temp->next!=s)
  88.     {
  89.         temp = temp->next;
  90.     }
  91.     temp->next = s->next;
  92.     free(s);
  93.     return OK;
  94. }
  95. status RecoveryRecover(Seqlist &L,node &link)
  96. {
  97.     if(L.lenght>MAXSIZE)
  98.     {
  99.         printf(“通讯录已满,”);
  100.         return OVERFLOW;
  101.     }
  102.     node* s;
  103.     status sta = 0;
  104.     sta = SearchRecover(link,s);
  105.     if(sta < 1) return ERROR;
  106.     else
  107.     {
  108.         L.seq[L.lenght] = s->date;
  109.         L.lenght++;
  110.         DeleteRecover(link,s);
  111.     }
  112.     return OK;
  113. }
  114. status EmptyRecover(node &link)
  115. {
  116.     node *temp = NULL;
  117.     while(link.next!=NULL)
  118.     {
  119.         temp = link.next;
  120.         link.next = temp->next;
  121.         free(temp);
  122.     }
  123.     printf(“回收站已清空!\n”);
  124.     return OK;
  125. }
  126. void SaveLinkList(node link)
  127. {
  128.     FILE *fp;
  129.     fp=fopen(“Recover.txt”,“w”);
  130.     if (fp==NULL)
  131.     {
  132.         exit(1);
  133.     }
  134.     node *p=link.next;
  135.     while(p->next)
  136.     {
  137.         fprintf(fp,“%s %s %s\n”,p->date.name,p->date.tel,p->date.email);
  138.         p=p->next;
  139.     }
  140.     fprintf(fp,”%s %s %s”,p->date.name,p->date.tel,p->date.email);
  141.     fclose(fp)  ;
  142. }