426GYY9826 2021-11-25 21:45 采纳率: 50%
浏览 118
已结题

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

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{//结构体的定义 
    int data;
    struct Node *next;
}Node;

//链栈的初始化
void Init(Node *p,int n){
    //建立了链栈的头结点 
    p=(Node *)malloc(sizeof(Node));
    p->data=0;
    p->next=NULL;
} 

//链栈的创建
Node* Create(Node *p,int e){//传入头指针以及要建立的入栈元素e 
    Node *s;//定义一个新的节点 
    s=(Node *)malloc(sizeof(Node));//为新的节点开辟空间 
    //头插法 
    s->data=e; 
    s->next=p->next;
    p->next=s;
    return p;
}
//出栈 
Node* Pop(Node *p,int *x){
    Node *r;
    r=p->next;//r指向链栈的第一个元素 
    if(r==NULL){
        printf("False");
        return p; 
    } 
    else{
        p->next=r->next;//出栈第一个元素 
        *x=r->data;//存储r的数据放在x中 
        free(x);//释放x所在的空间 
    }
    return p;    
} 
//输出(遍历)函数
void Output(Node *p){
    while(p->next!=NULL){
        p=p->next;//指向第一个元素 
        printf("%d",p->data); 
    } 
} 
int main(){
    int n,e,k=0;
    int *x;//存放出栈元素 
    printf("输入链栈的节点数");
    scanf("%d",&n); 
    Node *top;
    Init(top,n);//对于栈进行初始化 
    while(k<n){//入栈(多个元素) 
        printf("输入入栈元素:");
        scanf("%d",&e);
        Create(top,e);
        k++;
    }
    Pop(top,x);//出栈 
    Output(top); //输出(遍历)栈中的元素 
}

运行结果及报错内容

最后只有输入元素,没有输出元素

我的解答思路和尝试过的方法
我想要达到的结果

能够实现基本的入栈和出栈操作

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-11-26 00:31
    关注

    修改处见注释,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct Node{//结构体的定义
        int    data;
        struct Node *next;
    }Node;
    //链栈的初始化
    void Init(Node **p,int n){ //修改:void Init(Node *p,int n)
        //建立了链栈的头结点
        (*p)=(Node *)malloc(sizeof(Node));//修改
        (*p)->data=0;                     //修改
        (*p)->next=NULL;                  //修改
    }
    //链栈的创建
    Node* Create(Node *p,int e){//传入头指针以及要建立的入栈元素e
        Node *s;//定义一个新的节点
        s=(Node *)malloc(sizeof(Node));//为新的节点开辟空间
        //头插法
        s->data=e;
        s->next=p->next;
        p->next=s;
        return p;
    }
    //出栈
    Node* Pop(Node *p,int *x){
        Node *r;
        r=p->next;//r指向链栈的第一个元素
        if(r==NULL){
            printf("False");
            return p;
        }
        else{
            p->next=r->next;//出栈第一个元素
            *x=r->data;//存储r的数据放在x中
            free(r);//free(x);//释放x所在的空间
        }
        return p;
    }
    //输出(遍历)函数
    void Output(Node *p){
        while(p->next!=NULL){
            p=p->next;//指向第一个元素 
            printf("%d",p->data); 
        } 
    } 
    int main()
    {
        int n,e,k=0;
        int x;//int *x;//存放出栈元素   修改
        printf("输入链栈的节点数");
        scanf("%d",&n); 
        Node *top;
        Init(&top,n);//对于栈进行初始化 修改
        while(k<n){//入栈(多个元素) 
            printf("输入入栈元素:");
            scanf("%d",&e);
            top = Create(top,e);   //修改
            k++;
        }
        top = Pop(top,&x);//出栈   //修改
        printf("Pop data:%d\n",x); //修改
        Output(top); //输出(遍历)栈中的元素
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月10日
  • 已采纳回答 12月2日
  • 创建了问题 11月25日

悬赏问题

  • ¥15 k8s集群重启后,kubelet一直报systemctl restart kubelet.service "Failed to delete cgroup paths"
  • ¥15 微信小程序构建工具类发布到npm,install后报错
  • ¥15 amesim液压仿真问题
  • ¥15 python解析json文件时报错
  • ¥15 MATLAB优化设计
  • ¥15 ANN预测模型 200大米
  • ¥20 优秀学生的问题 oj java
  • ¥15 scratch-gui 如何集成进 react native
  • ¥15 把全局悬浮窗改为局内悬浮窗
  • ¥15 Excel vba编程调用word如何读取换行符