Bey-Hey 2022-04-21 21:47 采纳率: 85.7%
浏览 34
已结题

链栈的基本操作,进栈出现问题


//定义头文件
#include<stdio.h>
#include<malloc.h>
//定义元素类型
typedef char ElemType;
//定义链栈结点类型
typedef struct linknode
{
    ElemType data;
    struct linknode* next;
}LinkStNode;


//初始化链栈
int InitStack(LinkStNode*& s)
{
    //创建头结点
    s = (LinkStNode*)malloc(sizeof(LinkStNode));
    s->next = NULL;
}


//销毁栈
void ClearStack(LinkStNode*& s)
{
    //P指向栈顶元素
    LinkStNode* pre = s, * p = s->next;
    //循环到p为空
    while (p != NULL)
    {    //释放头结点
        free(pre);
        // P指针后移
        pre = p;
        p = pre->next;
        //此时pre指向尾结点,释放其空间
        free(pre);
    }
}


//求栈的长度
int StackLength(LinkStNode* s)
{    //P指向栈顶元素
    LinkStNode* p = s->next;
    int n;
    while (p != NULL)
    {   //长度加1
        n++;
        // P指针后移
        p->next = p;
    }
    //返回栈的长度
    return(n);
}


//判断栈是否为空
int StackEmpty(LinkStNode* s)
{
    return(s->next == NULL);
}


//进栈
void Push(LinkStNode*& s, ElemType e)
{
    //创建结点p
    LinkStNode* p;
    p = (LinkStNode*)malloc(sizeof(LinkStNode));
    // 给P数据域赋值
    p->data = e;
    //插入*p结点,使P作为第一个数据结点
    p->next = s->next;
    s->next = p;
}


//出栈
int Pop(LinkStNode*& s, ElemType& e)
{
    LinkStNode* p;
    //栈空的情况
    if (s->next == NULL)
        return false;
    //p指向第一个数据结点
    p = s->next;
    //保存出栈节点p的数据
    e = p->data;
    //删除p节点
    s->next = p->next;
    //释放p节点
    free(p);
    return 1;
}


//输出链栈
void DispStack(LinkStNode* s)
{
    LinkStNode* p;
    //p指向第一个数据结点
    p = s->next;
    while (p != NULL)
    {
        //输出P结点的数据
        printf("%c", p->data);
        //p后移
        p->next = p;
    }
    printf("\n");
}


int main()
{
    LinkStNode* s;
    ElemType e, a;
    int i;
    //调用InitStack()初始化栈
    printf("<1>初始化链栈\n");
    InitStack(s);
    printf("初始化链栈成功!\n");
    //调用StackEmpty()判断链栈是否为空
    printf("<2>栈为%s\n", (StackEmpty(s) ? "空" : "非空"));
    printf("<3>请输入%d个进栈元素:\n", 10);
    for (i = 0; i < 10; i++)
    {
        scanf("%c", &a);
        //调用Push()进栈
        Push(s, a);
    }

    //调用DispStack()输出栈
    DispStack(s);
    //调用StackEmpty()判断链栈是否为空
    printf("<4>栈为%s\n", (StackEmpty(s) ? "空" : "非空"));
    //调用StackLength()求链栈长度
    StackLength(s);
    printf("<5>出栈序列:");
    //调用Pop()使栈中元素出栈
    while (!StackEmpty(s))
    {
        Pop(s, e);
        printf("%c", e);
    }
    printf("\n");
    printf("<6>栈为%s\n", StackEmpty(s) ? "空" : "非空");
    printf("释放栈\n");
    ClearStack(s);
    return 1;
}

运行错误显示,忽略scanf返回值
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月29日
    • 创建了问题 4月21日

    悬赏问题

    • ¥15 jscolor 赋值input 没能引起前边色框的颜色变化
    • ¥100 驱动程序在\device\raidport1 上检测到控制器错误
    • ¥15 JS报错变量未定义,如何解决?
    • ¥20 找辅导 初学者 想实现一个项目 没有方向
    • ¥15 研究方向遥感场景识别分类。求深度学习基础课程
    • ¥15 关于渗漏场的电场分布模拟
    • ¥24 matlab怎么修改仿真初始时间
    • ¥15 两分段线性回归模型分析阈值效应
    • ¥15 前端和后端代码都没报错,但是点登录没反应的?
    • ¥100 需要远程解决QSQLITE问题!