2017-11-25 111 views
-1

我目前正试图做一个简单的堆栈菜单程序,将推动和弹出用户输入的值。 (也打印出堆栈)。堆栈将不会存储在C的价值

这是我迄今为止的代码。当我尝试插入一个值(情况1)时,我认为它有效 - 但我不确定,因为当我尝试打印出堆栈时(情况3),它总是说“堆栈为空!”。当我尝试弹出堆栈时(情况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); 
    } 
} 
+2

“我的代码有什么问题”:这是一个非常糟糕的方式来描述你的问题。 –

+0

哦,我很抱歉,这是我第一次使用这个网站,我不知道如何制作一个好标题。我应该怎样编辑它? – Kitty

+2

你应该把问题缩小到[mcve]。然后你就会知道要改变的标题 –

回答

0

做一些小改动喜欢做toppointerstaticmenu()功能,因为如果你不让它为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; 
     } 
    } 
} 

其余所有的逻辑是正确的。我希望它有帮助。

0

你实际上并没有把栈放在任何地方。每次在菜单中输入选项时,menu函数都会以空的Stack开头。当您插入,然后打印出Stack时,它将每次都有一个空的Stack

void menu(int choice) 
{ 
    Stack *top = EMPTY; // Problem - Always empty Stack for each call 
    int data; 
    ... 
} 

要解决这个问题,你需要要么有一个全局变量Stack或通过Stack为每一个使用功能。