2013-03-25 3 views
2
struct stack_struct 
    { 
     int number; 
     struct stack_struct *next_number; 
    }; 

    stack_struct *mainStruct; 

    class stack_class 
    { 
    private: 

     struct stack_struct *head; 

    public: 
     stack_class(); 
     //~stack_class(); 
     void pushNumber(int number); 
     void popANumber(); 
     void findNumber(); 
     void clearStack(); 
     void sizeFinder(); 
     void printStack(); 

    }; 

    stack_struct *pointerFunc,*pointerFunc2,*pointerFunc3,*printPointer; 

    stack_class::stack_class() 
    { 
     head=NULL; 
    } 

    void stack_class::pushNumber(int numberFunc) 
    { 

     if(head==NULL) 
     { 
      head = new stack_struct; 
      head->number = numberFunc; 
      head->next_number = NULL; 
      pointerFunc2=head; 
     } 
     else 
     { 
      pointerFunc = new stack_struct; 
      pointerFunc->number=numberFunc; 
      pointerFunc->next_number=NULL; 
      head->next_number=pointerFunc; 
      head=pointerFunc; 
     } 
    } 

    void stack_class::printStack() 
    { 

       while(pointerFunc2) 
       { 
        cout<<pointerFunc2->number<<endl; 
        pointerFunc2=pointerFunc2->next_number; 
       } 

    } 

    int optionChosen; 

    int main() 
    { 
     stack_class mainClassStack; 
     do 
     { 

      cin>>optionChosen; 

      switch(optionChosen) 
      { 
      case 1: 
      { 
       int pushInt; 
       cout<<"\n\nEnter Number: "; 
       cin >> pushInt; 
       mainClassStack.pushNumber(pushInt); 
       break; 
      } 
      case 2: 
      { 
       break; 
      } 
      case 3: 
      { 
       break; 
      } 
      case 4: 
      { 
       break; 
      } 
      case 5: 
      { 
       break; 
      } 
      case 6://print 
      { 
       mainClassStack.printStack(); 

       break; 
      } 
      default: 
      { 
       break; 
      } 
      } 
     }while(optionChosen!=7); 

     return 0; 

Я пытаюсь реализовать тип данных типа стека с использованием динамической памяти (связанного списка). Но когда я пытаюсь распечатать список, он только распечатывает список один раз, и если я попытаюсь снова перепечатать, используя опцию 6, его, как и список, исчезнет. Я дважды перебирал код, но не мог понять, в чем проблема. Какие-либо предложения?Связанный список не печатает правильно?

ответ

2

Проблема с вашим кодом заключается в том, что после печати стека вы не сбрасываете pointerFunc2, чтобы стать head.

Либо сбросить его правильно, либо использовать локальную переменную внутри вашей функции печати.

Вот исправленная версия вашей функции:

void stack_class::printStack() 
{ 
    while (pointerFunc2) 
    { 
     cout << pointerFunc2->number << endl; 
     pointerFunc2 = pointerFunc2->next_number; 
    } 

    // reset pointerFunc2 so the next iteration 
    // can start at the head and print again. 
    pointerFunc2 = head; 
} 
+0

Большое спасибо, ваш ответ дал идею использовать различную переменную для печати функции. – 2013-03-25 23:52:11

1

Причина вторая печать не работает, что вы используете глобальную переменную вместо локального одного:

stack_struct *pointerFunc2; 

Когда ты объявить переменную вне функции или класса, она становится глобальной переменной. Глобальные переменные выдержат вызовы функций и сохраняют значение, которое в них было последним. Чтобы быть локальным, переменная должна быть объявлена ​​внутриprintStack, инициализированной головкой стека, а затем удаляется при выходе из функции. То же самое можно сказать о pointerFunc.

Переменные printPointer и pointerFunc3 не используются и могут быть удалены из исходного кода.

2

Проблема заключается в том, когда вы печатаете из стека в первый раз с этим

pointerFunc2 = pointerFunc2-> next_number;

pointerFunc2 становится последним элементом после первой итерации. Вот почему вы думаете, что его нет. Вы должны сбросить указательFunc2, чтобы указать на головной узел после печати. Поэтому сначала сохраните его, затем, после повтора по всему списку, восстановите его, чтобы в следующий раз, когда вы напечатаете стек, вы начнете с головного узла.

+0

Я использовал третью переменную и сохранил 'pointerFunc2' там, где это было. Thanx для подсказки, +1 – 2013-03-25 23:56:14

+0

рад, что я могу помочь. Обычно вы можете использовать gdb, чтобы узнать, что происходит. Это очень мощный инструмент! – dean

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