链栈问题

wlnxxn 2021-02-15 06:56:59
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define Stack_ElemType int
typedef struct StackNode {
struct StackNode* next;
Stack_ElemType data;
}StackNode,*LinkStack;
//链栈初始化 // 返回的是链栈的首地址
StackNode* initStack(LinkStack S) {
S = (LinkStack)malloc(sizeof(StackNode));
if (S == NULL) {
printf("内存分配不成功!\n");
return 0;
};
S->next = NULL;
return S;
};
//创建链栈
StackNode* CreatStack(LinkStack S) {
StackNode* p;
int j = 1;
Stack_ElemType t = 0;
while (j) {
printf("请输入栈顶元素,输入-1时结束创建\n ");
scanf_s("%d", &t);
if (t == -1) {
break;
}
p = (LinkStack)malloc(sizeof(StackNode));
if (p == NULL) { // 动态分配空间后要进行判断否则会有警告
printf("内存分配不成功!\n");
return 0;
};
p->data = t;
p->next = S;
S = p;
};

return S;
}
// 链栈的压栈
void pushStack(LinkStack &S, Stack_ElemType e) {
StackNode* p;
p = (LinkStack)malloc(sizeof(StackNode));
if (p == NULL) { // 动态分配空间后要进行判断否则会有警告
printf("内存分配不成功!\n");
return;
}
p->data = e;
p->next = S;
printf("%d\n", p->data);
S = p;// 现在栈顶为刚压栈的p的结点

};
StackNode* popStack(LinkStack S, Stack_ElemType* e) {
StackNode *p;
if (S == NULL) {
return 0;
}
*e = S->data;
p = S;
S = S->next;
free(p);
return S;
};

Stack_ElemType StackLenth(StackNode S) {
int i = 1;
StackNode* p;
p = S.next;
while (p) {
p = p->next;
i++;
};
return i;
}
int main(void) {
StackNode* S;
S = NULL;
Stack_ElemType j = 0;
S = initStack(S);
S = CreatStack(S);

for (int i = 0; i < 5; i++) {
S = popStack(S, &j);
printf("%d\n", j);
};
S = popStack(S, &j);
printf("%d\n", j);
return 0;
}





请问一下 我加红的字体 为什么在这个函数内更改了S 的 地址 返回函数的时候却是已经被释放的p的地址呢?
但是我又返回了S的地址才可以继续下去
...全文
160 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
浪客 2021-02-18
  • 打赏
  • 举报
回复
p = S; free(p); 不就是free(S)了么
自信男孩 2021-02-18
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//#define Stack_ElemType int
typedef int Stack_ElemType;// int
typedef struct StackNode {
struct StackNode* next;
Stack_ElemType data;
}StackNode,*LinkStack;

//链栈初始化 // 返回的是链栈的首地址
//StackNode* initStack(LinkStack S) {
StackNode* initStack(LinkStack *S)
{
*S = (LinkStack)malloc(sizeof(StackNode));
if (*S == NULL) {
printf("内存分配不成功!\n");
return 0;
}//;
(*S)->next = NULL;
return *S;
} //;
//创建链栈
StackNode* CreatStack(LinkStack S)
{
StackNode* p;
int j = 1;
Stack_ElemType t = 0;
while (j) {
printf("请输入栈顶元素,输入-1时结束创建\n ");
//scanf_s("%d", &t);
scanf("%d", &t);
if (t == -1) {
break;
}
p = (LinkStack)malloc(sizeof(StackNode));
if (p == NULL) { // 动态分配空间后要进行判断否则会有警告
printf("内存分配不成功!\n");
//return 0;
return S;
}//;
p->data = t;
p->next = S;
S = p;
}//;

return S;
}
// 链栈的压栈
void pushStack(LinkStack &S, Stack_ElemType e) {
StackNode* p;
p = (LinkStack)malloc(sizeof(StackNode));
if (p == NULL) { // 动态分配空间后要进行判断否则会有警告
printf("内存分配不成功!\n");
return;
}
p->data = e;
p->next = S;
printf("%d\n", p->data);
S = p;// 现在栈顶为刚压栈的p的结点

};
StackNode* popStack(LinkStack S, Stack_ElemType* e) {
StackNode *p;
if (S == NULL) {
//return 0;
return NULL;
}
*e = S->data;
p = S;
S = S->next;
free(p);
return S;
}//;

Stack_ElemType StackLenth(StackNode S) {
int i = 1;
StackNode* p;
p = S.next;
while (p) {
p = p->next;
i++;
}//;
return i;
}

int main(void) {
StackNode* S;
S = NULL;
Stack_ElemType j = 0;
S = initStack(&S);
S = CreatStack(S);

//for (int i = 0; i < 5; i++) {
for (int i = 0; S; i++) {
S = popStack(S, &j);
if (S)
printf("%d\n", j);
}//;
S = popStack(S, &j);
if (S)
printf("%d\n", j);
return 0;
}


供参考~

多处出现了多余的分号;其他问题,供参考~

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧