鱼C论坛

 找回密码
 立即注册
查看: 1543|回复: 8

[已解决]free函数释放内存出错!求助

[复制链接]
发表于 2020-10-6 16:30:45 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct dy_lklist{
  4.     int num;
  5.     struct dy_lklist *next;
  6. };

  7. typedef struct dy_lklist NODE;

  8. NODE *creat_linklist();
  9. void print(NODE *head);
  10. NODE *delete(NODE *head);
  11. NODE *insert(NODE *head, NODE *stu);
  12. void free_linklist(NODE *head);

  13. void main(){
  14.     NODE *plist, stu, stu2;

  15.     plist = creat_linklist();
  16.     print(plist);
  17.     plist = delete(plist);
  18.     print(plist);
  19.     plist  = insert(plist, &stu);
  20.     print(plist);
  21.     plist  = insert(plist, &stu2);
  22.     print(plist);
  23.     printf("test2");
  24.     free_linklist(plist);
  25.     print(plist);
  26.     printf("test3");
  27. }   

  28. NODE *creat_linklist(){
  29.     NODE *p1, *p2, *head = NULL;
  30.     int n = 0;
  31.     p1 = (NODE *)malloc(sizeof(NODE));
  32.     if(p1 == NULL){
  33.         printf("no enough memory!");
  34.     }
  35.     p2 = p1;
  36.     printf("please input the number of student : ");
  37.     scanf("%d", &(p1->num));

  38.     while(p1->num != 0){
  39.         n += 1;
  40.         if (n == 1){
  41.             head = p1;
  42.         }
  43.         else{
  44.             p2->next = p1;
  45.         }
  46.         p2 = p1;
  47.         p1 = (NODE *)malloc(sizeof(NODE));
  48.         if(p1 == NULL){
  49.         printf("no enough memory!");
  50.         }
  51.         printf("please input the number of student : ");
  52.         scanf("%d", &(p1->num));
  53.     }
  54.     p2->next = NULL;

  55.     return head;
  56. }

  57. void print(NODE *head){
  58.     NODE *p;
  59.     p = head;
  60.     if(p == NULL){
  61.         printf("the linklist is null!");
  62.     }
  63.     if (NULL != head){
  64.         do{
  65.             printf("%d\n", p->num);
  66.             p = p->next;
  67.         } while (p != NULL);
  68.     }
  69. }

  70. NODE *delete(NODE *head){
  71.     int num;
  72.     NODE *p, *p1;
  73.     p1 = p = head;
  74.     printf("please input a number of student which you  want to delete: ");
  75.     scanf("%d", &num);

  76.     if (head != NULL){
  77.         do{
  78.             if(p->num == num){
  79.                 break;
  80.             }
  81.             p1 = p;
  82.             p = p->next;
  83.         }while(p != NULL);
  84.     }
  85.     else{
  86.         printf("the linklist is empty!\n");
  87.         goto END;
  88.     }
  89.     if (p == NULL){
  90.         printf("you want to delete the number is not exist!\n");
  91.         goto END;
  92.     }
  93.     else if (p == head){
  94.         head = p->next;
  95.     }
  96.     else{
  97.         p1->next = p->next;
  98.     }
  99.     free(p);
  100. END:
  101.     return head;
  102. }

  103. NODE *insert(NODE *head, NODE *stu){
  104.     NODE *p0, *p1, *p2;
  105.     int num;

  106.     printf("please input the number which you want to insert in the linklist : ");
  107.     scanf("%d", &num);
  108.     p0 = stu;
  109.     p0->num = num;

  110.     p1 = p2 = head;
  111.     if (head == NULL){
  112.         head = p0;
  113.         p0->next = NULL;
  114.         goto END;
  115.     }
  116.     while(p1->next != NULL && p2->num < p0->num){
  117.         p1 = p2;
  118.         p2 = p2->next;
  119.     }
  120.     if (p1->next == NULL){
  121.         p0->next = NULL;
  122.         p1->next = p0;
  123.     }
  124.     else if (p1 == head && p2 == head){
  125.         p0->next = head;
  126.         head = p0;
  127.     }
  128.     else{
  129.         p1->next = p0;
  130.         p0->next = p2;
  131.     }
  132. END:
  133.     return head;
  134. }
  135. #if(0)
  136. void free_linklist(NODE *head){
  137.     NODE *p1, *p2;

  138.     p1 = head;
  139.     while(p1->next != NULL){
  140.         p2 = p1;
  141.         p1 = p1->next;
  142.         free(p2);
  143.     }
  144.     free(p1);
  145.     printf("test1");
  146. }
  147. #endif

  148. #if(1)
  149. void free_linklist(NODE *head){
  150.     NODE *p, *q;

  151.     p = head;
  152.     while(p->next != NULL){
  153.         q = p->next;
  154.         p->next = q->next;
  155.         free(q);
  156.     }
  157.     free(head);
  158. }
  159. #endif
复制代码


程序的前面部分可以正常运行,但是在free_linklist(NODE *head)链表销毁函数这里卡住了
貌似是free函的原因,无法释放链表。
在vc++运行到这里的时候会出现一个界面Debug Assertrion Falied!


下面是出现的状况图片

                               
登录/注册后可看大图


求大佬解决,困惑好几天了

最佳答案
2020-10-7 15:08:25
第二个
void free_linklist(NODE *head){
    NODE *p,*q;

    p = head;
    while(p->next != NULL){
        q =p;
        p=p->next;
        free(q);
    }
    free(p);
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-6 16:32:13 | 显示全部楼层
https://imgchr.com/i/0N5oOx  这个是图片链接
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-6 16:37:05 | 显示全部楼层
图片在这  求解决
截图.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-7 08:35:26 From FishC Mobile | 显示全部楼层
那么问题来了,你要改第一个free_linklist,还是第二个,我实在理解不了第一个,感觉有逻辑错误。不过我能改第二个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-7 15:08:25 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
第二个
void free_linklist(NODE *head){
    NODE *p,*q;

    p = head;
    while(p->next != NULL){
        q =p;
        p=p->next;
        free(q);
    }
    free(p);
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 19:25:19 | 显示全部楼层
召唤风云 发表于 2020-10-7 15:08
第二个
void free_linklist(NODE *head){
    NODE *p,*q;

老哥  我的第一个和你写的这个不是一样吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 19:28:51 | 显示全部楼层
召唤风云 发表于 2020-10-7 15:08
第二个
void free_linklist(NODE *head){
    NODE *p,*q;

刚刚试了一下也不行 还是图片的那样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 20:04:56 | 显示全部楼层
召唤风云 发表于 2020-10-7 15:08
第二个
void free_linklist(NODE *head){
    NODE *p,*q;

用vs code调试的时候出现的是
出现异常。
Trace/breakpoint trap
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-15 08:36:56 From FishC Mobile | 显示全部楼层
ZhKQYu 发表于 2020-10-13 19:25
老哥  我的第一个和你写的这个不是一样吗

你的不一样,释放的顺序有问题,最后会导致程序崩溃。你可以自己举个例子。至于其他的,我不会
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-7 02:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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