马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 爱学习520 于 2020-7-20 15:32 编辑
为什么输出一直是这样子,如图:最后面一张
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct SNode{
int data;
struct SNode* next;
}*Stack;
//创建一个栈
Stack CreateStack(){
Stack s=(Stack)malloc(sizeof(struct SNode));
s->next=NULL;
return s;
}
//判断栈是否为空
int IsEmpty(Stack s){
return (s->next==NULL);
}
//进栈
void Push(Stack s,int data){
Stack cur=(Stack)malloc(sizeof(struct SNode));
cur->data=data;
//栈顶指向当前进栈的结点
cur->next=s;
s=cur;
}
//出栈
int Pop(Stack s){
if(IsEmpty(s)){
printf("栈为空,无法出栈!\n");
return NULL;
}
//保存当前的栈空间
Stack p=s;
//保存当前栈元素
int data=s->data;
//栈顶指向出栈后的栈顶空间
s=s->next;
//释放出栈的元素空间
free(p);
return data;
}
main(){
Stack s=CreateStack();
Push(s,5);
Push(s,6);
Push(s,7);
Push(s,8);
Push(s,9);
printf("出栈元素:%d",Pop(s));
}
然后我现在找到问题了,是因为s一直都指向建立栈时的栈底,所以我用了二级指针,把s的地址传递过去,每次进栈出栈后就是当前栈的指向了,可是我觉得二级指针太麻烦了,谁能继续改进一下
修改后的代码#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct SNode{
int data;
struct SNode* next;
}*Stack;
//创建一个栈
Stack CreateStack(){
Stack s=(Stack)malloc(sizeof(struct SNode));
s->next=NULL;
return s;
}
//判断栈是否为空
int IsEmpty(Stack s){
return (s->next==NULL);
}
//进栈
void Push(Stack *s,int data){
Stack cur=(Stack)malloc(sizeof(struct SNode));
cur->data=data;
//栈顶指向当前进栈的结点
cur->next=*s;
*s=cur;
}
//出栈
int Pop(Stack* s){
if(IsEmpty(*s)){
printf("栈为空,无法出栈!\n");
return NULL;
}
//保存当前的栈空间
Stack p=*s;
//保存当前栈元素
int data=(*s)->data;
//栈顶指向出栈后的栈顶空间
*s=(*s)->next;
//释放出栈的元素空间
free(p);
return data;
}
main(){
Stack s=CreateStack();
Push(&s,5);
Push(&s,6);
Push(&s,7);
Push(&s,8);
Push(&s,9);
printf("出栈元素:%d \n",Pop(&s));
printf("出栈元素:%d \n",Pop(&s));
printf("出栈元素:%d \n",Pop(&s));
printf("出栈元素:%d \n",Pop(&s));
}
让 Push 函数返回新的栈顶就可以了
Stack Push(Stack s,int data){
Stack cur=(Stack)malloc(sizeof(struct SNode));
cur->data=data;
//栈顶指向当前进栈的结点
cur->next=s;
return cur;
}
|