#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
/* 定义链栈结构体 */
typedef struct Stack{
int data;
struct Stack *next;
}StackNode,*LinkStack;
void initStack(LinkStack s){
s = (LinkStack)malloc(sizeof(StackNode));
s = NULL;
printf("初始化成功!\n");
// return 0;
}
void push(LinkStack s,int e){
LinkStack p = (LinkStack)malloc(sizeof(StackNode));
p->data = e;
p->next = s;
s = p;
printf("push: %d!\n",e);
}
void pop(LinkStack s,int *e){
LinkStack p = (LinkStack)malloc(sizeof(StackNode));
p = s;
*e = s->data;
s = s->next;
free(p);
printf("元素 %d 出栈成功!\n",e);
}
int getTop(LinkStack s){
// if(s != NULL){
// // return s->data;
// printf("getTop: %d\n",s->data);
// }
printf("getTop: %d\n",s->data);
return s->data;
}
int main(){
int e;
LinkStack s;
initStack(s);
push(s,1);
push(s,3);
push(s,5);
push(s,7);
push(s,9);
// 出栈
pop(s,&e);
// 获取栈顶元素
getTop(s);
}
请问为什么这里初始化一个不带头结点的链栈成功了,然后压栈之后进行出栈和获取栈顶元素操作总是失败呢?
麻烦懂的兄弟帮我看一下哪里有问题,谢谢!
修改处见注释,供参考:
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
/* 定义链栈结构体 */
typedef struct Stack{
int data;
struct Stack *next;
}StackNode,*LinkStack;
void initStack(LinkStack* s){ //修改
(*s) = (LinkStack)malloc(sizeof(StackNode));
(*s)->next = NULL; //修改 s = NULL;
printf("初始化成功!\n");
// return 0;
}
void push(LinkStack* s,int e){ //修改
LinkStack p = (LinkStack)malloc(sizeof(StackNode));
p->data = e;
p->next = (*s); //修改
(*s) = p; //修改
printf("push: %d!\n",e);
}
void pop(LinkStack* s,int *e){ //修改
if((*s)->next == NULL) {
printf("栈已空!\n");
return;
}
LinkStack p = NULL; //(LinkStack)malloc(sizeof(StackNode));修改
p = (*s); //修改
*e = (*s)->data; //修改
(*s) = (*s)->next; //修改
free(p);
printf("元素 %d 出栈成功!\n",*e); //修改
}
int getTop(LinkStack s){
if(s->next == NULL){ //修改
printf("栈已空!");
return 0;
}
printf("getTop: %d\n",s->data);
return s->data;
}
int main(){
int e;
LinkStack s;
initStack(&s); //修改
push(&s,1); //修改
push(&s,3); //修改
push(&s,5); //修改
push(&s,7); //修改
push(&s,9); //修改
// 出栈
pop(&s,&e); //修改
pop(&s,&e); //修改
//pop(&s,&e);
//pop(&s,&e);
//pop(&s,&e);
//pop(&s,&e);
// 获取栈顶元素
getTop(s);
return 0;
}
这里push的时候只改变了push函数中s的值,改的是函数中的局部变量,没有改变主函数中s的值,因此主函数中s一直都是NULL。
改法
1.将s设成全局变量
2.将所有函数中的s作为返回值传回主函数
3.函数间传递s的指针