我正在创建一个包含链表的堆栈。我编写了推送和显示堆栈部分,但是当我尝试显示堆栈内容时,它只是将最后输入的数据作为输出。为什么会这样?
struct LinkedStack {
int data;
struct LinkedStack* next;
};
struct LinkedStack *first = NULL;
struct LinkedStack *previous = NULL;
struct LinkedStack *current = NULL;
int main(void) {
int data = 0, choice = 0;
if(current == NULL) {
printf("\nNo Memory Allocated");
}
while(1) {
printf("\n1. Push Data");
printf("\n2. Pop Data");
printf("\n3. Display The Stack");
printf("\n4. Exit");
printf("\nEnter Your Choice::\n");
scanf("%d", &choice);
switch(choice) {
case 1:
current = (struct node *)malloc(sizeof(struct LinkedStack));
printf("Enter the data:: ");
scanf("%d", &data);
push(¤t, data);
break;
case 3:
printf("\n\n Stack Contents::");
displayStack(current);
break;
case 4:
exit(1);
default:
printf("\nWrong Choice.Enter Again");
}
}
}
void push(struct LinkedStack **s, int usrdata) {
if(first == NULL) {
first = *s;
}
if(previous != NULL) {
previous->next = *s;
}
(*s)->data = usrdata;;
(*s)->next = NULL;
previous = *s;
}
void displayStack(struct LinkedStack *s) {
struct LinkedStack *temp = (struct LinkedStack *)malloc(sizeof(struct LinkedStack));
if(temp == NULL) {
printf("No Memory Allocated");
}
temp = s;
while(temp != NULL) {
printf("\n %d", temp->data);
temp = temp->next;
}
}
答案 0 :(得分:1)
如果您正确推送数据,请尝试
case 3:
printf("\n\n Stack Contents::");
displayStack(first);
break;
而不是
case 3:
printf("\n\n Stack Contents::");
displayStack(current);
break;
displayStack()函数需要引用链接列表的前面。
我希望这能解决你的问题。
答案 1 :(得分:0)
我的建议是从删除那些全局变量开始。尝试将堆栈视为LinkedStack *
类型的单个变量。
然后就此实施push
和pop
。没有全局变量:这些函数的调用者传入指向该变量的指针,即函数应该有签名:
void push(LinkedStack **stack, int data);
int pop(LinkedStack **stack);
这就是你已经在做的事情,所以我猜你至少有一些正确的想法。 ;)
问自己的问题:
push
到空堆栈会怎么样? (不要担心在这个阶段从空堆栈弹出;当其他所有工作正常时,请担心。)LinkedStack *
变量如何按push
和pop
进行更新?