我目前正在尝试创建一个简单的Stack菜单程序,该程序将推送和弹出用户输入的值。 (并打印出堆栈。)
这是我到目前为止的代码。当我尝试插入一个值(案例1)时,我认为它有效 - 但我不确定,因为当我尝试打印出堆栈(案例3)时,它总是说"堆栈是空的!&# 34 ;.当我尝试弹出堆栈(案例2)时,它就会崩溃。
我不知道我的某个结构是否已关闭,或者我的指针是否正确。
提前感谢您的帮助,对于凌乱的代码我感到非常抱歉 - 我还是很陌生!
#include<stdio.h>
#include<stdlib.h>
#define EMPTY 0
struct node
{
int data;
struct node *link;
};
typedef struct node Stack;
Stack* get_node()
{
Stack *tmp;
tmp = (Stack*) malloc(sizeof(Stack));
tmp->link = EMPTY;
return tmp;
}
void push(Stack **top, int data)
{
Stack *tmp;
tmp = *top;
*top = get_node();
(*top)->data = data;
(*top)->link = tmp;
}
void pop(Stack **top)
{
Stack *tmp;
int num;
if (top == EMPTY)
{
printf("Stack is Empty!");
}
else
{
tmp = *top;
printf("%d", tmp->data);
*top = tmp->link;
free(tmp);
}
}
void stack(Stack *top)
{
if (top == EMPTY)
{
printf("Stack is Empty...");
}
else
{
Stack *tmp = top;
while (tmp->link != EMPTY)
{
printf("%d", tmp->data);
tmp = tmp->link;
}
}
}
void menu(int choice)
{
Stack *top = EMPTY;
int data;
switch (choice)
{
case 1:
printf("Enter Data : ");
scanf_s("%d", &data);
push(&top, data);
break;
case 2:
pop(&top);
break;
case 3:
stack(top);
break;
case 4:
exit(1);
}
}
void main()
{
int choice;
printf("< < = M e n u = = >\n");
printf("1.push\n");
printf("2.pop\n");
printf("3.print_all\n");
printf("4.quit\n");
printf("Select : ");
while (1)
{
scanf_s("%d", &choice);
menu(choice);
}
}
答案 0 :(得分:0)
您实际上并没有将堆栈保留在任何位置。每次在菜单中输入选项时,menu
函数都会以空Stack
开头。当您插入,然后打印Stack
时,每次都会有一个空的Stack
。
void menu(int choice)
{
Stack *top = EMPTY; // Problem - Always empty Stack for each call
int data;
...
}
要解决此问题,您需要拥有全局变量Stack
或将Stack
传递给每个函数以供使用。
答案 1 :(得分:0)
在top
函数中执行一些小的更改,例如将pointer
static
作为menu()
,因为如果您不将其设为static
,则会每次使用zero
初始化。
替换此
Stack *top = EMPTY;
与
static Stack *top ;
并修改stack()
功能,您打印的元素少了
void stack(Stack *top)
{
if (top == EMPTY)
{
printf("Stack is Empty...");
}
else
{
Stack *tmp = top;
while (tmp != EMPTY) // here you wrote as tmp->link
{
printf("%d \n ", tmp->data);
tmp = tmp->link;
}
}
}
剩下的所有逻辑都是正确的。我希望它有所帮助。