鱼C论坛

 找回密码
 立即注册
查看: 2163|回复: 1

[已解决]带你学C带你飞第48课中的通讯录建设,关于链表删除函数导致程序崩溃

[复制链接]
发表于 2018-4-19 17:20:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个程序中的删除函数4(void delPerson(PNODE head))里面我想用if语句来判别,如果输入的信息通讯录中没有数据,就提示printf("未找到要删除的通讯录");但是我输入通讯录没有的数据后程序就崩溃了,想请诸位给解答一下,我到底是那里错了,我已经派了一天的错了,没找到原因。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>


  4. typedef struct Boss
  5. {
  6.                 char name[120];  //姓名
  7.                 int  number[120];      //电话
  8.                 char addr[1024]; //地址
  9.                 struct Boss *next; //信息域
  10. }NODE, *PNODE;



  11. void addPerson(PNODE *head); //插入新的联系人
  12. void my_scanf(PNODE phead);  //输入数据函数
  13. void fidPerson(PNODE head); //查找已有联系人
  14. void changePerson(PNODE head); //更改已有联系人
  15. void delPerson(PNODE head);  //删除已有联系人
  16. void my_printf(PNODE phead); //显示查找目录
  17. void displayPerson(PNODE head);  //显示当前通讯录
  18. void releasePerson(PNODE *head);  //退出通讯录程序,释放内存空间



  19. void addPerson(PNODE *head)      //插入新的联系人
  20. {
  21.                 PNODE phead;
  22.                 static PNODE tail;

  23.                 phead = (PNODE)malloc(sizeof(NODE));
  24.                 if(phead == NULL)
  25.                 {
  26.                                 printf("内存分配失败");
  27.                                 exit(1);
  28.                 }

  29.                 my_scanf(phead);

  30.                 if((*head)->next != NULL)
  31.                 {
  32.                                 tail->next = phead;
  33.                                 phead->next = NULL;
  34.                 }
  35.                 else
  36.                 {
  37.                                 (*head)->next = phead;
  38.                                 phead->next = NULL;
  39.                 }
  40.                 tail = phead;
  41.                

  42. }

  43. void my_scanf(PNODE phead)       //输入数据函数
  44. {
  45.                 printf("姓名:");
  46.                 scanf("%s", &phead->name);
  47.                 printf("电话:");
  48.                 scanf("%s", &phead->number);
  49.                 printf("地址:");
  50.                 scanf("%s", &phead->addr);
  51. }

  52. void fidPerson(PNODE head)     //查找已有联系人
  53. {

  54.                 char temp[120];

  55.                 printf("请输入你要查找姓名:");
  56.                 scanf("%s", &temp);
  57.                
  58.                 while(head != NULL)
  59.                 {
  60.                                 if(!strcmp(head->name, temp))
  61.                                 {
  62.                                                 my_printf(head);
  63.                                 }
  64.                                
  65.                                 head = head->next;
  66.                                
  67.                                 if(head == NULL)
  68.                                 {
  69.                                                 printf("该通讯录中没有%s的信息\n", temp);
  70.                                 }
  71.                 }
  72. }
  73. void changePerson(PNODE head)   //更改已有联系人
  74. {
  75.                 char temp[120];
  76.                 PNODE first;
  77.                 PNODE second;

  78.                 first = (PNODE)malloc(sizeof(NODE));

  79.                 printf("请输入你要更改的通讯录:");
  80.                 scanf("%s",&temp);

  81.                 /*printf("将%s的目录更改为:\n", temp);*/
  82.                 /*my_scanf(first);*/

  83.                 while(head != NULL)
  84.                 {
  85.                                 if(!strcmp(head->name, temp))
  86.                                 {
  87.                                                 printf("将%s的目录更改为:\n", temp);
  88.                                                 my_scanf(head);
  89.                                                 break;
  90.                                 }
  91.                                                
  92.                                 head = head->next;

  93.                                 if(head == NULL)
  94.                                 {
  95.                                                 printf("该通讯录中没有%s的信息,可以更改\n", temp);
  96.                                 }
  97.                 }

  98.                 /*while(head != NULL)
  99.                 {
  100.                                 second = head;
  101.                                 head = head->next;
  102.                                 if(!strcmp(head->name, temp))
  103.                                 {
  104.                                                 break;
  105.                                 }
  106.                 }*/
  107.                
  108. }
  109. void delPerson(PNODE head)      //删除已有联系人,并同时释放内存空间
  110. {
  111.                 char temp[120];
  112.                 PNODE first;
  113.                 PNODE second;

  114.                 printf("请输入你要删除通讯录的姓名:");
  115.                 scanf("%s", &temp);

  116.                 while(head != NULL)
  117.                 {
  118.                                 first = head;
  119.                                 head = head->next;
  120.                                 second = head;
  121.                                 if(!strcmp(head->name, temp))
  122.                                 {
  123.                                                 first->next = head->next;
  124.                                                 free(second);
  125.                                                 break;
  126.                                 }

  127.                                 if(head == NULL)
  128.                                 {
  129.                                                 printf("未找到要删除的通讯录");
  130.                                 }
  131.                 }

  132. }
  133. void my_printf(PNODE phead)
  134. {
  135.                 printf("以查找的你所需要的信息内容如下:\n");
  136.                 printf("姓名:%s\n", phead->name);
  137.                 printf("电话:%s\n", phead->number);
  138.                 printf("地址:%s\n", phead->addr);
  139. }
  140. void displayPerson(PNODE head)  //显示当前通讯录
  141. {
  142.                 PNODE temp;
  143.                 temp = head->next;
  144.                
  145.                 while(temp != NULL)
  146.                 {
  147.                                 printf("姓名:%s\n", temp->name);
  148.                                 printf("电话:%s\n", temp->number);
  149.                                 printf("地址:%s\n", temp->addr);
  150.                                 temp = temp->next;
  151.                 }
  152. }
  153. void releasePerson(PNODE *head)  //退出通讯录程序,释放内存空间
  154. {
  155.                 PNODE temp;
  156.                
  157.                 while(*head != NULL)
  158.                 {
  159.                                 temp = (*head)->next;
  160.                                 *head = (*head)->next;
  161.                                 free(temp);
  162.                 }
  163. }

  164. int main(void)
  165. {
  166.                 PNODE head;
  167.                 head->next = NULL;
  168.                 int ch;

  169.                 printf("插入新的联系人'1'\n");
  170.                 printf("查找已有联系人'2'\n");
  171.                 printf("更改已有联系人'3'\n");
  172.                 printf("删除已有联系人'4'\n");
  173.                 printf("显示当前目录'5'\n");
  174.                 printf("退出通讯录,并释放空间'6'\n");

  175.                 while(1)
  176.                 {
  177.                                 printf("请输入代码:");

  178.                                 if((ch = getchar()) == '1')
  179.                                 {
  180.                                                 addPerson(&head);
  181.                                 }
  182.                                 else if(ch == '2')
  183.                                 {
  184.                                                 fidPerson(head);
  185.                                 }
  186.                                 else if(ch == '3')
  187.                                 {
  188.                                                 changePerson(head);
  189.                                 }
  190.                                 else if(ch == '4')
  191.                                 {
  192.                                                 delPerson(head);
  193.                                 }
  194.                                 else if(ch == '5')
  195.                                 {
  196.                                                 displayPerson(head);
  197.                                 }
  198.                                 else if(ch == '6')
  199.                                 {
  200.                                                 releasePerson(&head);
  201.                                                 break;
  202.                                 }
  203.                                 else
  204.                                 {
  205.                                                 getchar();
  206.                                                 printf("您输入的信息有误请从新输入\n");
  207.                                 }
  208.                                 getchar();
  209.                 }
  210.                



  211.                 return 0;
  212. }
复制代码
最佳答案
2018-4-19 18:18:45
138行要写成
  1. scanf("%s", temp);
复制代码

那个删除功能的函数我给改写了一下,,
  1. void delPerson(PNODE head)      //删除已有联系人,并同时释放内存空间
  2. {
  3.         char temp[120];
  4.         PNODE first;
  5.         PNODE second;

  6.         printf("请输入你要删除通讯录的姓名:");
  7.         scanf("%s", temp);//这里要写对
  8.         if (head->next == NULL){
  9.                 printf("通讯录为空\n");
  10.                 return;
  11.         }


  12.         while (head->next != NULL)
  13.         {
  14.                 first = head;
  15.                 head = head->next;
  16.                 second = head;
  17.                 if (!strcmp(head->name, temp))
  18.                 {
  19.                         first->next = head->next;
  20.                         free(second);
  21.                         break;
  22.                 }

  23.                 if (head->next == NULL)
  24.                 {
  25.                         printf("未找到要删除的通讯录");
  26.                 }
  27.         }

  28. }
复制代码


这个时侯这个功能可以正常运行了,
但是还有主函数中的前两句:
  1. PNODE head = (PNODE)malloc(sizeof(NODE));//这里要动态申请空间
  2.         head->next = NULL;//这里要是用的话一定要之前动态申请空间啊
复制代码

不是很明白楼主为啥要head->next = NULL;
我没有看过这个视频,但是感觉这个head->next = NULL;有点怪,还有注意看我的注释,main函数里没有分配空间的话我的VS2013是运行时Runtime Error的,
还有这个程序的功能4是解决了,但是功能6还是有一点问题,自己可以试一下,找一找bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-19 18:18:45 | 显示全部楼层    本楼为最佳答案   
138行要写成
  1. scanf("%s", temp);
复制代码

那个删除功能的函数我给改写了一下,,
  1. void delPerson(PNODE head)      //删除已有联系人,并同时释放内存空间
  2. {
  3.         char temp[120];
  4.         PNODE first;
  5.         PNODE second;

  6.         printf("请输入你要删除通讯录的姓名:");
  7.         scanf("%s", temp);//这里要写对
  8.         if (head->next == NULL){
  9.                 printf("通讯录为空\n");
  10.                 return;
  11.         }


  12.         while (head->next != NULL)
  13.         {
  14.                 first = head;
  15.                 head = head->next;
  16.                 second = head;
  17.                 if (!strcmp(head->name, temp))
  18.                 {
  19.                         first->next = head->next;
  20.                         free(second);
  21.                         break;
  22.                 }

  23.                 if (head->next == NULL)
  24.                 {
  25.                         printf("未找到要删除的通讯录");
  26.                 }
  27.         }

  28. }
复制代码


这个时侯这个功能可以正常运行了,
但是还有主函数中的前两句:
  1. PNODE head = (PNODE)malloc(sizeof(NODE));//这里要动态申请空间
  2.         head->next = NULL;//这里要是用的话一定要之前动态申请空间啊
复制代码

不是很明白楼主为啥要head->next = NULL;
我没有看过这个视频,但是感觉这个head->next = NULL;有点怪,还有注意看我的注释,main函数里没有分配空间的话我的VS2013是运行时Runtime Error的,
还有这个程序的功能4是解决了,但是功能6还是有一点问题,自己可以试一下,找一找bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表