ZhKQYu 发表于 2020-10-6 16:30:45

free函数释放内存出错!求助

#include <stdio.h>
#include <stdlib.h>

struct dy_lklist{
    int num;
    struct dy_lklist *next;
};

typedef struct dy_lklist NODE;

NODE *creat_linklist();
void print(NODE *head);
NODE *delete(NODE *head);
NODE *insert(NODE *head, NODE *stu);
void free_linklist(NODE *head);

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

    plist = creat_linklist();
    print(plist);
    plist = delete(plist);
    print(plist);
    plist= insert(plist, &stu);
    print(plist);
    plist= insert(plist, &stu2);
    print(plist);
    printf("test2");
    free_linklist(plist);
    print(plist);
    printf("test3");
}   

NODE *creat_linklist(){
    NODE *p1, *p2, *head = NULL;
    int n = 0;
    p1 = (NODE *)malloc(sizeof(NODE));
    if(p1 == NULL){
      printf("no enough memory!");
    }
    p2 = p1;
    printf("please input the number of student : ");
    scanf("%d", &(p1->num));

    while(p1->num != 0){
      n += 1;
      if (n == 1){
            head = p1;
      }
      else{
            p2->next = p1;
      }
      p2 = p1;
      p1 = (NODE *)malloc(sizeof(NODE));
      if(p1 == NULL){
      printf("no enough memory!");
      }
      printf("please input the number of student : ");
      scanf("%d", &(p1->num));
    }
    p2->next = NULL;

    return head;
}

void print(NODE *head){
    NODE *p;
    p = head;
    if(p == NULL){
      printf("the linklist is null!");
    }
    if (NULL != head){
      do{
            printf("%d\n", p->num);
            p = p->next;
      } while (p != NULL);
    }
}

NODE *delete(NODE *head){
    int num;
    NODE *p, *p1;
    p1 = p = head;
    printf("please input a number of student which youwant to delete: ");
    scanf("%d", &num);

    if (head != NULL){
      do{
            if(p->num == num){
                break;
            }
            p1 = p;
            p = p->next;
      }while(p != NULL);
    }
    else{
      printf("the linklist is empty!\n");
      goto END;
    }
    if (p == NULL){
      printf("you want to delete the number is not exist!\n");
      goto END;
    }
    else if (p == head){
      head = p->next;
    }
    else{
      p1->next = p->next;
    }
    free(p);
END:
    return head;
}

NODE *insert(NODE *head, NODE *stu){
    NODE *p0, *p1, *p2;
    int num;

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

    p1 = p2 = head;
    if (head == NULL){
      head = p0;
      p0->next = NULL;
      goto END;
    }
    while(p1->next != NULL && p2->num < p0->num){
      p1 = p2;
      p2 = p2->next;
    }
    if (p1->next == NULL){
      p0->next = NULL;
      p1->next = p0;
    }
    else if (p1 == head && p2 == head){
      p0->next = head;
      head = p0;
    }
    else{
      p1->next = p0;
      p0->next = p2;
    }
END:
    return head;
}
#if(0)
void free_linklist(NODE *head){
    NODE *p1, *p2;

    p1 = head;
    while(p1->next != NULL){
      p2 = p1;
      p1 = p1->next;
      free(p2);
    }
    free(p1);
    printf("test1");
}
#endif

#if(1)
void free_linklist(NODE *head){
    NODE *p, *q;

    p = head;
    while(p->next != NULL){
      q = p->next;
      p->next = q->next;
      free(q);
    }
    free(head);
}
#endif

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

下面是出现的状况图片
https://imgchr.com/i/0N5oOx

求大佬解决,困惑好几天了{:10_266:}

ZhKQYu 发表于 2020-10-6 16:32:13

https://imgchr.com/i/0N5oOx这个是图片链接

ZhKQYu 发表于 2020-10-6 16:37:05

图片在这求解决

召唤风云 发表于 2020-10-7 08:35:26

那么问题来了,你要改第一个free_linklist,还是第二个,我实在理解不了第一个,感觉有逻辑错误。不过我能改第二个

召唤风云 发表于 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);
}

ZhKQYu 发表于 2020-10-13 19:25:19

召唤风云 发表于 2020-10-7 15:08
第二个
void free_linklist(NODE *head){
    NODE *p,*q;


老哥我的第一个和你写的这个不是一样吗{:10_257:}

ZhKQYu 发表于 2020-10-13 19:28:51

召唤风云 发表于 2020-10-7 15:08
第二个
void free_linklist(NODE *head){
    NODE *p,*q;


刚刚试了一下也不行 还是图片的那样

ZhKQYu 发表于 2020-10-13 20:04:56

召唤风云 发表于 2020-10-7 15:08
第二个
void free_linklist(NODE *head){
    NODE *p,*q;


用vs code调试的时候出现的是
出现异常。
Trace/breakpoint trap

召唤风云 发表于 2020-10-15 08:36:56

ZhKQYu 发表于 2020-10-13 19:25
老哥我的第一个和你写的这个不是一样吗

你的不一样,释放的顺序有问题,最后会导致程序崩溃。你可以自己举个例子。至于其他的,我不会
页: [1]
查看完整版本: free函数释放内存出错!求助