darkflammme 2018-02-08 03:10 采纳率: 100%
浏览 945
已采纳

关于栈的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 04:04
    关注

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

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

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

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部