2014-02-15 60 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