鱼C论坛

 找回密码
 立即注册
查看: 1588|回复: 5

[已解决]单链表3 课后 通讯录程序

[复制链接]
匿名鱼油
匿名鱼油  发表于 2023-3-2 13:35:59 |阅读模式

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

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

x
本帖最后由 匿名 于 2023-3-2 13:40 编辑

问题:为何释放节点之后会有残留?

预想情况:在 void delCall(struct Call *head) 的情况下,del的head无法与main中的head建立联系,将curr的节点删除之后,打印main中的head链表应该无法输出结果,空或是乱码。

运行结果

运行结果


如图,删除的b节点有一部分数据保留了,这是为什么?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. struct Call
  5. {
  6.     char name[128];
  7.     char number[128];
  8.     struct Call *next;
  9. };

  10. void addCall(struct Call **head);
  11. void findCall(struct Call *head);
  12. void changeCall(struct Call *head);
  13. void delCall(struct Call *head);
  14. void printCall(struct Call *head);
  15. void freeCall(struct Call *head);

  16. void addCall(struct Call **head)
  17. {
  18.     struct Call *new = NULL;

  19.     new = (struct Call *) malloc(sizeof(struct Call));

  20.     if(new == NULL)
  21.     {
  22.         exit(1);
  23.     }

  24.     printf("请输入姓名:");
  25.     scanf("%s",new->name);
  26.     printf("请输入电话:");
  27.     scanf("%s",new->number);

  28.     if(*head != NULL)
  29.     {
  30.         new->next = *head;
  31.         *head = new;
  32.     }
  33.     else
  34.     {
  35.         *head = new;
  36.         new->next = NULL;
  37.     }
  38. }

  39. void findCall(struct Call *head)
  40. {
  41.     char name[128];
  42.     struct Call *temp = head;

  43.     printf("请输入联系人:");
  44.     scanf("%s",name);

  45.     do
  46.     {
  47.         if(!strcmp(temp->name,name))
  48.         {
  49.             printf("联系人:%s\n",temp->name);
  50.             printf("电话:%s\n",temp->number);
  51.         }
  52.     }
  53.     while((temp = temp->next) != NULL);

  54.     if(temp == NULL)
  55.     {
  56.         printf("抱歉,没有此人的联系方式\n");
  57.     }
  58. }

  59. void changeCall(struct Call *head)
  60. {
  61.     char name[128];
  62.     struct Call *temp = head;

  63.     printf("请输入联系人:");
  64.     scanf("%s",name);

  65.     do
  66.     {
  67.         if(!strcmp(temp->name,name))
  68.         {
  69.             printf("请输入新的联系电话:");
  70.             scanf("%s",temp->number);
  71.             break;
  72.         }
  73.     }
  74.     while((temp = temp->next) != NULL);                       

  75.     if(temp == NULL)                                                       
  76.     {
  77.         printf("抱歉,没有此人的联系方式\n");
  78.     }
  79. }

  80. void delCall(struct Call *head)
  81. {
  82.     char name[128];
  83.     struct Call *current = head;
  84.     struct Call *previous = NULL;

  85.     printf("请输入联系人:");
  86.     scanf("%s",name);

  87.     while(current != NULL)
  88.     {
  89.         if(!strcmp(current->name,name))
  90.         {
  91.             break;
  92.         }

  93.         previous = current;
  94.         current = current->next;
  95.     }

  96.     if(current == NULL)
  97.     {
  98.         printf("抱歉,没有此人的联系方式\n");
  99.     }
  100.     else
  101.     {
  102.         if(previous == NULL)
  103.         {
  104.             head = current->next;
  105.         }
  106.         else
  107.         {
  108.             previous->next = current->next;
  109.         }
  110.         free(current);
  111.     }
  112. }

  113. void printCall(struct Call *head)
  114. {
  115.     while(head != NULL)
  116.     {
  117.         printf("联系人:%s\n",head->name);
  118.         printf("电话:%s\n",head->number);
  119.         head = head->next;
  120.     }
  121. }

  122. void freeCall(struct Call *head)
  123. {
  124.     struct Call *temp = head;

  125.     while (head != NULL)
  126.     {
  127.         temp = head;
  128.         head = head->next;
  129.         free(temp);
  130.     }
  131. }

  132. int main(void)
  133. {
  134.     int input;
  135.     struct Call *head = NULL;

  136.     printf("\n| 欢迎使用通讯录管理程序 |\n\n");
  137.     printf("|---1.插入新的联系人---|\n");
  138.     printf("|---2.查找已有通讯录---|\n");
  139.     printf("|---3.更改已有通讯录---|\n");
  140.     printf("|---4.删除已有通讯录---|\n");
  141.     printf("|---5.显示当前通讯录---|\n");
  142.     printf("|---6.退出通讯录程序---|\n");
  143.     printf("|- Powered by FishC.com -|\n\n");

  144.     while(1)
  145.     {
  146.         printf("请输入指令代码:");
  147.         scanf("%d",&input);

  148.         switch(input)
  149.         {
  150.             case 1: addCall(&head); putchar('\n'); break;
  151.             case 2: findCall(head); putchar('\n'); break;
  152.             case 3: changeCall(head); putchar('\n'); break;
  153.             case 4: delCall(head); putchar('\n'); break;               //疑问为什么删除节点,只有名字丢失
  154.             case 5: printCall(head); putchar('\n'); break;
  155.             case 6: freeCall(head); printf("感谢使用!\n"); goto END;        
  156.         }
  157.     }

  158.     END:
  159.     return 0;
  160. }
复制代码
最佳答案
2023-3-3 09:30:28
Aixer 发表于 2023-3-2 20:07
嗯嗯,我更想问的问题是为什么在头节点位置没有改变的情况下,本被释放的数据还会有保留,并且链表被打印 ...

free是告诉操作系统这块内存空闲了,可以被再分配,但是里面存放的内容并没有被擦除,被再次使用之前,它的内容保持不变

预想情况

预想情况
回复

使用道具 举报

发表于 2023-3-2 15:20:52 | 显示全部楼层

回帖奖励 +10 鱼币

  1. case 4: delCall(head); putchar('\n'); break;               //疑问为什么删除节点,只有名字丢失

  2. if(previous == NULL)
  3.         {
  4.             head = current->next;   这里的head是一个局部变量,链表头结点的位置并没有改变
  5.         }


  6. case 4:  这里应该传head的地址 delCall( &head)   子程序做相应更改
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-2 17:54:45 | 显示全部楼层

回帖奖励 +10 鱼币

领个鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-2 20:07:11 | 显示全部楼层

嗯嗯,我更想问的问题是为什么在头节点位置没有改变的情况下,本被释放的数据还会有保留,并且链表被打印了下来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-3 09:30:28 | 显示全部楼层    本楼为最佳答案   
Aixer 发表于 2023-3-2 20:07
嗯嗯,我更想问的问题是为什么在头节点位置没有改变的情况下,本被释放的数据还会有保留,并且链表被打印 ...

free是告诉操作系统这块内存空闲了,可以被再分配,但是里面存放的内容并没有被擦除,被再次使用之前,它的内容保持不变
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-3 15:27:41 | 显示全部楼层
两手空空儿 发表于 2023-3-3 09:30
free是告诉操作系统这块内存空闲了,可以被再分配,但是里面存放的内容并没有被擦除,被再次使用之前,它 ...

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 04:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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