读书人

链栈的基本操作、指针兑现能调试不运

发布时间: 2013-07-08 14:13:00 作者: rapoo

链栈的基本操作、指针实现,能调试不运行
//此程序较简单,调用函数三个,为(初始化)(入栈)(出栈)。通过循环入栈实现建立栈,循环出栈实现栈的逆序输出。
//问题:调试没错,语法应该没问题,但输入值运行的时候不行,
//本人使用软件为VC++

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0

#define MASIZE 100
typedef int SElemType;
typedef int Status;

typedef struct StackNode{
SElemType date;
struct StackNode *next;
}StackNode,*LinkStack;
StackNode *S;

int main()
{
Status InitStack(); //初始化
Status Push(SElemType e); //入栈
Status Pop(SElemType e); //出栈

int N,i;
SElemType X,E;
InitStack(); //初始化

printf("输入要建立栈的长度:"); //此处通过入栈实现栈的建立
scanf("%d",&N);
printf("空格隔开输入%d个数:",N);
for(i=0;i<N;i++){
scanf("%d",&X);
Push(X); //入栈
}

printf("逆序输出栈:");//此处通过出栈实现栈的逆序输出
for(i=N;i>0;i++){
E=Pop(E); //出栈
printf("%d",E);
}

return 0;
}

Status InitStack()//初始化
{
S=NULL;
return OK;
}

Status Push(SElemType e)//入栈
{
StackNode *p;
p->date=e;
p->next=S;
S=p;
return OK;
}

Status Pop(SElemType e)//出栈
{
//StackNode *p;
if(S==NULL) return ERROR;
e=S->date;
//p=S;//此处用来下面释放p,我已将其注释
S=S->next;
//delete p;//释放原栈顶指针空间
return OK;
}
[解决办法]


#include<stdio.h>
#include<stdlib.h>



#define OK 1
#define ERROR 0

#define MASIZE 100
typedef int SElemType;
typedef int Status;

typedef struct StackNode{
SElemType date;
struct StackNode *next;
}StackNode,*LinkStack;
StackNode *S;

int main()
{
Status InitStack();
Status Push(SElemType e);
Status Pop(SElemType *e);

int N,i;
SElemType X,E;
InitStack();

printf("输入要建立栈的长度:");
scanf("%d",&N);
printf("空格隔开输入%d个数:",N);
for(i=0;i<N;i++){
scanf("%d",&X);
Push(X);
}

printf("逆序输出栈:");
for(i=N;i>0;--i){//这里是--吧。。
Pop(&E);
printf("%d",E);
}

return 0;
}

Status InitStack()
{
S=NULL;
return OK;
}

Status Push(SElemType e)
{
StackNode *p =(StackNode*)malloc(sizeof(StackNode));//这里你都没为节点分配空间。。
p->date=e;
p->next=S;
S=p;
return OK;
}

Status Pop(SElemType *e)//这里不能传值。。你改的只是e的副本。。改为传指针。。
{
//StackNode *p;
if(S==NULL) return ERROR;
*e=S->date;
//p=S;//此处用来下面释放p,我已将其注释
S=S->next;
//delete p;//释放原栈顶指针空间
return OK;
}


[解决办法]
#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0

#define MASIZE 100
typedef int SElemType;
typedef int Status;

typedef struct StackNode{
SElemType date;
struct StackNode *next;
}StackNode,*LinkStack;
StackNode *S;

int main()
{
Status InitStack(); //初始化
Status Push(SElemType e); //入栈
Status Pop(SElemType* e); //出栈

int N,i;
SElemType X,E;
InitStack(); //初始化

printf("输入要建立栈的长度:"); //此处通过入栈实现栈的建立
scanf("%d",&N);
printf("空格隔开输入%d个数:",N);
for(i=0;i<N;i++){
scanf("%d",&X);
Push(X); //入栈


}

printf("逆序输出栈:");//此处通过出栈实现栈的逆序输出
for(i=N;i>0;i--){
Pop(&E); //出栈时让变量E将出栈的数据带出,函数返回值表示验证成功或者失败
printf("%4d",E);
}

return 0;
}

Status InitStack()//初始化
{
S=NULL;
return OK;
}

Status Push(SElemType e)//入栈
{
StackNode *p;
p = (StackNode*)malloc(sizeof(StackNode));//为e对应的节点申请内存空间
if(NULL == p)
{
printf("内存不足!\n");
return ERROR;
}
p->date=e;
p->next=S;
S=p;
return OK;
}

Status Pop(SElemType *e)//出栈
{
StackNode *p;
if(S==NULL) return ERROR;
*e=S->date;
p=S;//此处用来下面释放p,我已将其注释
S=S->next;
free(p); //我上面用malloc函数,所以这里用free函数,你要是想用delete函数,申请空间就用new函数
//delete p;//释放原栈顶指针空间
return OK;
}


楼主用链式存储的话,就要记得给节点申请内存空间。第二:明确函数返回值的作用。是表示函数内出错还是要带给被调用函数的值。

读书人网 >C++

热点推荐