wocao58 2017-03-30 07:55 采纳率: 100%
浏览 1084
已采纳

为什么我这【链表】 内存释放不了?

程序可以运行,可以输入,可以输出,但是到了释放内存的时候就有问题了 求大神指正。

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


typedef struct node{
    int data;
    struct node *next;
}*LPNODE;

LPNODE CreateList(int n);
void ShowList(LPNODE lphead);

int main(void)
{
    LPNODE lpHead, temp, current;
    int num;

    puts("请问您需要几个节点?");
    scanf_s("%d", &num);
    lpHead = CreateList(num);
    ShowList(lpHead);

    //释放链表
    current = lpHead;       
    while (current != NULL)
    {
        temp = current->next;
        free(current);
        current = temp;
    }

    return 0;
}

LPNODE CreateList(int n)
{
    int _data, count = 0;
    LPNODE lpHead = NULL;
    LPNODE current, prev;

    lpHead = current = prev = (LPNODE)malloc(sizeof(LPNODE));

    puts("请输入一个数字:");
    while (scanf_s("%d", &_data))
    {
        current = (LPNODE)malloc(sizeof(LPNODE));


        prev->next = current;

        current->data = _data;
        current->next = NULL;

        prev = current;

        count++;    //控制循环
        if (count < n)
            puts("请输入下一个数字");
        else
        {
            puts("输入结束!");
            break;
        }
    }
    return lpHead;
}

void ShowList(LPNODE lpHead)
{
    LPNODE p = lpHead->next;

    while (p != NULL)
    {
        printf("%d  ", p->data);
        p = p->next;
    }
}

  • 写回答

3条回答 默认 最新

  • 小灸舞 2017-03-30 08:19
    关注

    free出错是因为你malloc的时候申请的空间不对。
    lpHead = current = prev = (LPNODE)malloc(sizeof(LPNODE));以及current = (LPNODE)malloc(sizeof(LPNODE));不对
    因为你sizeof(LPNODE)相当于sizeof(指针),在32位机上永远是4
    你typedef的时候应该多取一个名字,假设叫LPLEN,然后应该改成(LPNODE)malloc(sizeof(LPLEN));

     #include <stdio.h>
    #include <stdlib.h>
    
    
    typedef struct node{
        int data;
        struct node *next;
    }*LPNODE,LPLEN;
    
    LPNODE CreateList(int n);
    void ShowList(LPNODE lphead);
    
    int main(void)
    {
        LPNODE lpHead, temp, current;
        int num;
    
        puts("请问您需要几个节点?");
        scanf_s("%d", &num);
        lpHead = CreateList(num);
        ShowList(lpHead);
    
        //释放链表
        current = lpHead;
        while (current != NULL)
        {
            temp = current->next;
            free(current);
            current = temp;
        }
    
        return 0;
    }
    
    LPNODE CreateList(int n)
    {
        int _data, count = 0;
        LPNODE lpHead = NULL;
        LPNODE current, prev;
    
        lpHead = current = prev = (LPNODE)malloc(sizeof(LPLEN));
    
        puts("请输入一个数字:");
        while (scanf_s("%d", &_data))
        {
            current = (LPNODE)malloc(sizeof(LPLEN));
    
    
            prev->next = current;
    
            current->data = _data;
            current->next = NULL;
    
            prev = current;
    
            count++;    //控制循环
            if (count < n)
                puts("请输入下一个数字");
            else
            {
                puts("输入结束!");
                break;
            }
        }
        return lpHead;
    }
    
    void ShowList(LPNODE lpHead)
    {
        LPNODE p = lpHead->next;
    
        while (p != NULL)
        {
            printf("%d  ", p->data);
            p = p->next;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮