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日

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊