rsZheng4916 2022-01-14 22:43 采纳率: 60%
浏览 45
已结题

【链栈】基本操作实现错误

#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);
}

请问为什么这里初始化一个不带头结点的链栈成功了,然后压栈之后进行出栈和获取栈顶元素操作总是失败呢?

麻烦懂的兄弟帮我看一下哪里有问题,谢谢!

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-01-16 15:20
    关注

    修改处见注释,供参考:

    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月25日
  • 已采纳回答 1月25日
  • 创建了问题 1月14日

悬赏问题

  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?