Yester07 2022-04-03 16:54 采纳率: 48.5%
浏览 27
已结题

打印链栈元素之后,程序异常退出。

下面是我做的链栈的基本内容,测试发现打印栈的功能出现了问题,循环体结束之后,程序会异常退出,但是没有找到原因,打印链表的函数我之前一直用在其他文件里面,没出现过这样的问题,但是复制到这里来就用不了了。vs没有报warning或者error。


```c

#include "stdio.h"
#include "stdlib.h"
typedef struct node
{
    int data;
    struct node* next;
}node;

int push(node* s,int x)
{
    if (s) 
    {
        node* p;
        p = (node*)malloc(sizeof(node));
        p->data = x;
        if (s->next == NULL)
            s->next = p;
        else
        {
            p->next = s->next;
            s->next = p;
        }
        return 1;
    }
    return 0;
}

int pop(node* s)
{
    if (s->next == NULL)
    {
        printf("空栈\n");
        return 0;
    }
    node* p;
    p = s->next;
    s->next = s->next->next;
    free(p);
    return 1;
}

int  displist(node* l)
{
    node* p;
    if (l)
    {
        p = l;
        while (p->next != NULL)
        {
            p = p->next;
            printf("%d\t", p->data);
        }
        printf("\n");
        return 1;
    }
    return 0;
}

int init(node* s)
{
    s->next = NULL;
    return 1;
}

int gettop(node* s)
{
    return s->next->data;
}

int main()
{
    node* s;
    int y, e, status = 0;
    exe:
    printf("菜单:\n1.栈初始化\t2.入栈\n3.出栈\t4.取栈顶元素\n5.打印栈\n");
    scanf("%d", &y);
    switch (y)
    {
    case 1:status = init(&s); break;
    case 2:printf("请输入入栈元素:"); scanf("%d", &e); status = push(&s, e); break;
    case 3:status = pop(&s); break;
    case 4:e = gettop(&s); printf("%d\n", e); break;
    case 5:status = displist(&s); break;
    default:return 0;
        break;
    }
    if (status == 1)
        printf("exe succeeded\n");
    else printf("exe failed\n");
    goto exe;
    return 0;
}

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/225170679846173.png "#left")
  • 写回答

1条回答 默认 最新

  • fuill 2022-04-03 19:58
    关注

    push函数有问题

    int push(node* s,int x)
    {
        if (s)
        {
            node* p;
            p = (node*)malloc(sizeof(node));
            p->data = x;
            if (s->next == NULL)
            {
                s->next = p;
                s->next->next=NULL;//加了这句 
            }
            else
            {
                p->next = s->next;
                s->next = p;
            }
            return 1;
        }
        return 0;
    }
    

    修改后可以运行

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 赞助了问题酬金5元 4月3日
  • 创建了问题 4月3日

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算