2301_78618908 2023-10-24 23:12 采纳率: 12.5%
浏览 5

链栈的输入输出操作没有输出结果

链栈的输入输出操作,可以输入但是没有输出


#include <stdio.h>
#include <stdlib.h>
typedef struct stacknode {
    int data;
    struct stacknode *next;
} stacknode;

int  initiate(stacknode *top) {
    
    top=(stacknode*)malloc(sizeof(stacknode));
top=NULL;
    return 0;
}

int  push(stacknode *top, int x) {
    stacknode* s = (stacknode *)malloc(sizeof(stacknode));
    s->data = x;
    s->next = top;
    top = s;
    return 0 ;
}

int  pop(stacknode *top) {
    if (top == NULL)
        return NULL;
    stacknode *s;
    s = top;
int z=s->data;
    top = top->next;
if(top==NULL){
    return NULL;
}
    free(s);
    return z;
}

int main() {
    int i,j,x,m=0;
    stacknode top;
    initiate(&top);

    for(i=0;i<5;i++){
        scanf("%d",&x);
        push(&top,x);
    }
    
    for(j=0;j<5;j++){
        int m=pop(&top);
        printf("%d",m);
    }
    return 0;


}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-25 08:38
    关注

    【以下回答由 GPT 生成】

    问题出在initiate函数中,你在该函数中传递了top的指针,然后在函数中将其指向了一个新分配的内存地址。但是在函数外部,top的值并没有被更新,仍然为NULL。所以在后续的push和pop操作中,链栈的头指针始终指向了NULL,导致无法正常插入和弹出元素。

    为了解决这个问题,你可以将initiate函数修改为使用二级指针进行传递,并将传递的指针指向新分配的内存地址。这样可以确保在函数外部更新top的值。

    下面是修改后的代码:

    int initiate(stacknode **top) {
        *top=(stacknode*)malloc(sizeof(stacknode));
        *top=NULL;
        return 0;
    }
    

    main函数中调用initiate函数时,你需要将&top作为参数传递给函数,而不仅仅是top。这样initiate函数内部就能修改top的指向了。

    initiate(&top);
    

    接下来,你需要在pushpop函数中进行一些修改。在这两个函数中,你需要将传入的二级指针top改为一级指针,因为你只想改变指针指向的值,而不是改变指针本身的指向。

    下面是修改后的pushpop函数:

    int push(stacknode **top, int x) {
        stacknode* s = (stacknode *)malloc(sizeof(stacknode));
        s->data = x;
        s->next = *top;
        *top = s;
        return 0;
    }
    
    int pop(stacknode **top) {
        if (*top == NULL)
            return NULL;
        stacknode *s;
        s = *top;
        int z = s->data;
        *top = (*top)->next;
        free(s);
        return z;
    }
    

    main函数中,你也需要将pushpop函数的调用修改为&top,以传递一级指针的地址。

    push(&top,x);
    
    int m = pop(&top);
    printf("%d ",m);
    

    这样,你的代码就能正常工作了。可以通过后进先出的顺序输出输入的数据。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月24日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物