2014-02-15 63 views
1

我正在创建一个带有链接列表的堆栈。我编码了推送和显示堆栈部分,但是当我尝试显示堆栈内容时,它只是生成最后输入的数据作为输出。这是为什么发生?解释使用链接列表实现的堆栈的输出

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(&current, 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

再次阅读该问题。我已经在那里写了一切。它不可能比这更具体。 – arindrajit

+0

在案例3中,displayStack(第一个)显示整个列表。如果你显示堆栈(当前),它将只显示最后一个项目。另外,你不需要在displayStack中使用malloc。在displayStack处: – cup

+0

:不需要'malloc'。 – BLUEPIXY

回答

0

我的建议是从删除这些全局变量开始。尝试将堆栈看作类型为LinkedStack *的单个变量。

然后执行pushpop。没有全局变量:这些函数的调用者传递一个指针变量,即功能应该有签名:

void push(LinkedStack **stack, int data); 
int pop(LinkedStack **stack); 

这是你在做什么了,所以我的猜测是,你至少有一些正确的想法。 ;)

问题要问自己:

  • 是什么空栈是什么样子?
  • 如果我将push设置为空堆栈,会发生什么情况? (不要担心在这个阶段从空栈中弹出;当其他所有工作都在工作时,请担心。)
  • 当弹出某些内容时,LinkedStack节点的内存如何释放?
  • 来电者的LinkedStack *变量如何更新pushpop
1

如果你正确地推数据,然后尝试的

case 3: 
     printf("\n\n Stack Contents::"); 
     displayStack(first); 
     break; 

代替

 case 3: 
     printf("\n\n Stack Contents::"); 
     displayStack(current); 
     break; 

的displayStack()函数需要您的链接列表的前一个参考。

我希望这可以解决您的问题。

+0

@ user1370217-我已经根据你的建议尝试过了,但现在它只是显示堆栈中的前两个数据,而忽略其余部分。你能否通过push()并确认它是否可行。如果没关系,那么为什么其他数据没有显示? – arindrajit