鱼C论坛

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

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

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

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

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

x
#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 you  want 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!


下面是出现的状况图片

                               
登录/注册后可看大图


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

最佳答案
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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-6 16:32:13 | 显示全部楼层
https://imgchr.com/i/0N5oOx  这个是图片链接
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-6 16:37:05 | 显示全部楼层
图片在这  求解决
截图.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-7 08:35:26 From FishC Mobile | 显示全部楼层
那么问题来了,你要改第一个free_linklist,还是第二个,我实在理解不了第一个,感觉有逻辑错误。不过我能改第二个
想知道小甲鱼最近在做啥?请访问 -> 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);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

老哥  我的第一个和你写的这个不是一样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

刚刚试了一下也不行 还是图片的那样
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的不一样,释放的顺序有问题,最后会导致程序崩溃。你可以自己举个例子。至于其他的,我不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 21:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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