问题遇到的现象和发生背景
使用C语言实现链栈,然后想要遍历一遍栈里面的内容
//这是栈的结构
typedef struct snode {
AddressTyrpe data;//存的是入栈元素的地址
struct snode* pNext;
struct snode* pPrio;
}SNODE;
typedef struct stack {//带头结点的链表做栈
SNODE head;
SNODE* top;
}STACK;
//方式一(报错的):
void InitStack(STACK* S) {//初始化
S->head.pPrio = NULL;
S->head.pNext = NULL;
S->top = &S->head;
}
bool StackEmpty(STACK S) {//判空
if (S.top ==S.head && S.head.pNext==NULL && S.head.pPrio==NULL) {
printf("空栈\n");
return true;
}
else {
return false;
}
}
void Traverse(STACK S) {//遍历
if (StackEmpty(*S)) {
return ;
}
else {
//SNODE* p = S->top;
while (S.top != &(S.head)) {
//在这里报错,当明明s.top应该等于s.head了但是debug显示不相等,然后继续进去head的data未初始化就报错了
printf("%d ", *(S.top.data));
S.top = S.top .pPrio;
}
printf("\n");
}
}
//方式二(后来改出来正确的):
void InitStack(STACK* S) {
S->head.pPrio = NULL;
S->head.pNext = NULL;
S->top = &S->head;
}
bool StackEmpty(STACK S) {
if (S.head.pNext==NULL && S.head.pPrio==NULL) {
printf("空栈\n");
return true;
}
else {
return false;
}
}
void Traverse(STACK* S) {//主要改了传参方式然后就正确了
if (StackEmpty(*S)) {
return ;
}
else {
SNODE* p = S->top;
while (p != &(S->head)) {
printf("%d ", *(p->data));
p = p->pPrio;
}
printf("\n");
}
}
我的问题:
方式一这个地方传入S是main函数的复制品为什么top到头时候就不会和head相等,而使用方式二传入参数是&S也就是S的地址的时候相等又可以了,有人可以解惑一下吗?