【无头链栈】二级指针写法,为什么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)则能运行,这是为什么
二级指针不是很会用