标题:【无头链栈】二级指针写法,为什么free(u)时报错?
只看楼主
小小小腿
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2022-5-9
结帖率:100%
已结贴  问题点数:20 回复次数:3 
【无头链栈】二级指针写法,为什么free(u)时报错?
程序代码:
//链栈:逻辑结构:线性表中的栈;存储结构:链式存储
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct Linknode {
    ElemType data;            //数据域
    struct Linknode* next;    //指针域
}*LinkStack;
LinkStack InitStack() {
    //初始化链栈
    LinkStack S = NULL;   //错误点之一,先赋值NULL,再使用malloc
    S = (LinkStack)malloc(sizeof(LinkStack));
    return S;
}
//运行完形参S没有返回给实参S
void Push(LinkStack* S, ElemType x) {    //头插法压入元素
    LinkStack p = (LinkStack)malloc(sizeof(LinkStack));

    //链栈无需判满,动态分配内存
    p->data = x;     //给p结点赋值
    p->next = (*S);
    (*S) = p;
}
ElemType Pop(LinkStack* S) {//头删法
    LinkStack u;
    ElemType x;
    //出栈,判空,报错
    if (*S == NULL)
        return;
    x = (*S)->data;     //保存栈顶数据,返回x
    u = (*S)->next;     //①把表头的下一个保存起来
    //free(u);            //②释放表头。错误原因未知,注释则可运行
    *S = u;             //③把表头设置为下一个结点
    return x;
}
ElemType getTop(LinkStack S) {
    if (S == NULL) {
        printf("NULL\n");
        return 0;
    }
    ElemType x = S->data;
    return x;
}
void printElemTop(LinkStack S) {
    printf("%d\n", getTop(S));
}
int main(void) {
    LinkStack s = InitStack();
    Push(&s, 21);
    Pop(&s);
    Push(&s, 32);

    Push(&s, -123);
    printElemTop(s);
}


注:Debug到Pop()函数里的free(u)时报错,注释掉free(u)则能运行,这是为什么
二级指针不是很会用
搜索更多相关主题的帖子: 链栈 NULL 指针 报错 free 
2022-05-09 00:52
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
回复 楼主 小小小腿
你注释掉以后,这部分空间就消失了,然后你还想接着用????怎么可能

DO IT YOURSELF !
2022-05-09 08:48
不会游泳的虾
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:101
专家分:643
注 册:2021-7-1
得分:20 
修改见注释,供参考:
程序代码:
//链栈:逻辑结构:线性表中的栈;存储结构:链式存储
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct Linknode {
    ElemType data;            //数据域
    struct Linknode* next;    //指针域
}*LinkStack;
LinkStack InitStack() {
    //初始化链栈
    LinkStack S = NULL;   
    //S = (LinkStack)malloc(sizeof(struct Linknode));//修改
    //S = (LinkStack)malloc(sizeof(LinkStack));//sizeof(LinkStack)是一个指针的大小
    return S;
}
//运行完形参S没有返回给实参S
void Push(LinkStack* S, ElemType x) {    //头插法压入元素
    LinkStack p = (LinkStack)malloc(sizeof(struct Linknode)); //修改
    //LinkStack p = (LinkStack)malloc(sizeof(LinkStack));sizeof(LinkStack)是一个指针的大小
    //链栈无需判满,动态分配内存
    p->data = x;     //给p结点赋值
    p->next = (*S);
    (*S) = p;
}
ElemType Pop(LinkStack* S) {//头删法
    LinkStack u;
    ElemType x;
    //出栈,判空,报错
    if (*S == NULL)
        return -1;      //修改
       //return;
    x = (*S)->data;     //保存栈顶数据,返回x
    u = (*S);      //修改//①把表头的下一个保存起来
    //u = (*S)->next;
    (*S) = u->next;     //③把表头设置为下一个结点
    //*S = u;       //修改
    free(u);       //修改 //②释放表头。错误原因未知,注释则可运行
    return x;
}
ElemType getTop(LinkStack S) {
    if (S == NULL) {
        printf("NULL\n");
        return 0;
    }
    ElemType x = S->data;
    return x;
}
void printElemTop(LinkStack S) {
    printf("%d\n", getTop(S));
}
int main(void) {
    LinkStack s = InitStack();

    Push(&s, 21);
    printf("Pop():%d\n",Pop(&s));  //Pop(&s);//修改

    Push(&s, 32);
    Push(&s, -123);
    printElemTop(s);
    printf("Pop():%d\n", Pop(&s)); //修改
    printf("Pop():%d\n", Pop(&s)); //修改

    return 0;
}
2022-05-09 09:47
小小小腿
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2022-5-9
得分:0 
问题解决了,根本原因是malloc分配时sizeof()出错
2022-05-10 15:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509032-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.207659 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved