首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-07-08 
链栈的基本操作、指针实现,能调试不运行//此程序较简单,调用函数三个,为(初始化)(入栈)(出栈)。通过循环入栈

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


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

热点排行