m0_68473077 2024-07-24 16:20 采纳率: 100%
浏览 3
已结题

clion写的代码不知道哪里有问题

(数据结构初学者),问一下各位这个代码哪里有问题,自己实在是找不到了
用clion写的代码,双向链表实现的链栈,但是弹出栈顶元素永远是0。
下面是代码


```c++
#include <stdio.h>
#include <stdlib.h>

typedef struct DSNode{
    int data;
    struct DSNode *last;
    struct DSNode *next;
}DSNode;
typedef struct DStack{
    struct DSNode *head,*tail;
}DStack,* DSTack;
bool InitDStack(DSTack &S)
{
    S = (DStack*)malloc(sizeof(DStack));
    DSNode *p=(DSNode*)malloc(sizeof(DSNode));
    p->last=NULL;
    p->next=NULL;
    S->head=p;
    S->tail=p;
    return true;
}
bool StackEmpty(DSTack S)
{
    if(S->tail==S->head)
        return true;//此时栈为空
    else
        return false;//此时栈不为空
}
bool push(DSTack &S,int n)
{
    DSNode *q=(DSNode*)malloc(sizeof(DSNode));
    q->data=n;
    q->next=NULL;
    q->last=S->tail;
    S->tail->next=q;
    S->tail=q;
    return true;
}
bool pop(DSTack &S,int  &n)
{
    if (StackEmpty(S))
        return false;
    DSNode *t=S->tail;
    n=S->tail->data;
    S->tail=t->last;
    S->tail->next=NULL;
    free(t);
    return true;
}

void print(DSTack S)
{
    while(S->tail!=S->head)
    {
        printf("%d",S->tail->data);
        S->tail=S->tail->last;
    }
}

int main() {
     DSTack S;
    int x;
    InitDStack(S);
    push(S,1);
    push(S,3);
    push(S,5);
    push(S,7);
    print(S);
    printf("\n");
    pop(S,x);
    printf("%d",x);
    return 0;
}
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/m0_68473077/article/details/140662995
  • 写回答

5条回答 默认 最新

  • 关注

    因为你的print函数中,已经把S->tail移动到S->head了,也就是变相的把链表给清空了,所以调用print(S)后,再调用pop()函数的时候,S已经是空的了,所以输出x错误。只需要修改一下print函数的实现即可,如下:

    void print(DSTack S)
    {
        DSNode* p = S->tail;
        while(p!=S->head)
        {
            printf("%d ",p->data);
            p=p->last;
        }
    }
    
    

    另外,你这个代码是C和C++混写,虽然也能当C++代码用,但是需要注意区别:
    (1)函数参数里的&,是引用的意思,但是C语言中,没有引用的概念,引用是C++中的概念;
    下面是纯C语言代码及运行结果:

    img

    代码:

    void print(DSTack S)
    {
        DSNode* p = S->tail;
        while(p!=S->head)
        {
            printf("%d ",p->data);
            p=p->last;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月25日
  • 创建了问题 7月24日

悬赏问题

  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥15 allegro17.2生成bom表是空白的