2014-02-15 3 views
1

Я создаю стек со связанным списком. Я закодировал часть пакета push и display, но он просто выводит последние введенные данные в качестве вывода, когда я пытаюсь отобразить содержимое стека. Почему это происходит?Объяснение вывода стека, реализованного с помощью связанного списка

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 (первый), чтобы отобразить весь список. Если вы показываетеStack (текущий), он отображает только последний элемент. Кроме того, вам не нужно malloc в displayStack. – cup

+0

на displayStack: не нужно 'malloc'. – BLUEPIXY

ответ

0

Мой совет - начать с удаления этих глобальных переменных. Постарайтесь думать о стеке как о единственной переменной типа LinkedStack *.

Затем выполните push и pop с точки зрения этого. Никаких глобальных переменных: вызывающему этих функций передает указатель на эту переменную, то есть функции, должны иметь подписи:

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

Это то, что вы делаете уже, так что я думаю, у вас есть по крайней мере, некоторые из правильные идеи. ;)

Вопросы спросить себя:

  • , что делает пустой стек выглядеть?
  • Что произойдет, если я push в пустой стек? (Не беспокойтесь о том, чтобы выскочить из пустого стека на этом этапе, беспокоиться об этом, когда все остальное работает.)
  • Как память для узла LinkedStack освобождается, когда что-то появляется?
  • Как измененная переменная LinkedStack * вызывающего абонента обновляется push и pop?
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

Смежные вопросы