darkflammme 2018-02-08 11:10 采纳率: 100%
浏览 944
已采纳

关于栈的Top操作的问题 c语言实现 链表实现 数据结构

头文件
struct Node{
int data;
struct Node *Next;
};
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

int IsEmpty(Stack S);
void MakeEmpty(Stack S);
Stack CreateStack(void);
void Push(int X,Stack S);
int Top(Stack S);
void Pop(Stack S);

#include
#include "stack.h"
#include

int IsEmpty(Stack S)
{
return S->Next == NULL;
}

void MakeEmpty(Stack S)
{
if(S == NULL)
printf("must");
else
while(!IsEmpty(S))
Pop(S);
}

Stack CreateStack(void)
{
Stack S;

S = malloc(sizeof(struct Node));
if(S == NULL)
    printf("Out of range");
S->Next = NULL;
MakeEmpty(S);
return S;

}

void Push(int X,Stack S)
{
PtrToNode TmpCell;

TmpCell = malloc(sizeof(struct Node));
if(TmpCell == NULL)
    printf("Out of range");
else
{
   TmpCell->data = X;
   TmpCell->Next = S->Next;
   S->Next = TmpCell;

}

}

int Top(Stack S)
{
if(!IsEmpty(S))
return S->Next->data;
printf("Out of range");
return 0;
}

void Pop(Stack S)
{
PtrToNode FirstCell;

if(IsEmpty(S))
    printf("Out of range");
else
{
    FirstCell = S->Next;
    S->Next = S->Next->Next;
    free(FirstCell);

}

}

这个基本上是照书一点一点打的,我不太懂关于Top操作
为什么知道了指向栈底部的指针S就可以用
S->Next->data 得知栈顶元素,这个我自己实验过是对的。
因为假如这个栈是由3个链表连起来的,S->Next->data应该得到的是第二个链表里面的元素啊。
S->Next->Next->data才是栈顶的元素。
我也曾怀疑过是不是Push操作改变了指针S指向的地方。。但打印出的S的地址都是一样啊。
顺便可以问一下,假如我要打印某个地址 是应该 用 %d 吗,我的文本编辑器总报warning。。
提一下我的文本编辑器是geany 编译器是gcc Linux下
我是小白。。求指教啊啊啊啊。。google后也不明白。。卡了好几天了
希望有人可以帮我一下..

  • 写回答

2条回答

  • wtf178 2018-02-08 12:04
    关注

    S不是栈顶,S是栈顶的上面,S->Next指向的才是栈顶,你画个图就知道了,不要把S当做一个节点,S是个指针,不是一个节点,
    是个Next指向栈顶的节点指针,S里面的data没用,就那个Next有用
    所以S-Next->data是栈顶元素
    push是在栈顶上面加的,所以,push实际上是加载了S和旧的栈顶之间,形成了新的栈顶

    打印地址 int 类型,%d可以。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器