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 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。