2010-04-26 3 views
0

Стек инициализируется с помощью int MaxSize = 3. Затем я нажимаю один int в списке. «Вытолкнуто:» возвращается на консоль. Программа вылетает здесь. Я думаю, что моя логика ошибочна, но неуверена. Может быть, бесконечный цикл или неудовлетворенное условие? Спасибо за вашу помощь.Связанный список push()

Я пытаюсь пройти список до последнего узла во второй части метода full(). Я реализовал этот стек как массив, поэтому должен реализовать этот метод full(), поскольку этот метод находится внутри основного класса.

while(!stacker.full()) { 
    cout << "Enter number = "; 
    cin >> intIn; 
    stacker.push(intIn); 
    cout << "Pushed: " << intIn << endl; 
}//while 

Позвоните по ссылкеListStack.cpp в класс LinkList full().

int LinkList::full() { 
    if(head == NULL) { 
     top = 0; 
    } else { 
     LinkNode * tmp1; 
     LinkNode * tmp2; 
     tmp1 = head; 
     while(top != MaxSize) { 
      if(tmp1->next != NULL){ 
       tmp2 = tmp1->next; 
       tmp1 = tmp2; 
       ++top; 
      }//if 
     }//while 
    }//else 
return (top + 1 == MaxSize); 
} 

Толчок метод здесь:

void LinkList::push(int numIn) { 
    LinkNode * nodeIn = new LinkNode(numIn); 
    if(head == NULL) { 
     head = nodeIn; 
    }else { 
     nodeIn = head; 
     head = nodeIn; 
    } 
} 
+0

Почему бы не просто использовать класс Stack в C++? – zsong

+0

'top' похоже, является членом данных LinkList. Но какова его цель? Вы просто увеличиваете его в своей ветке else, не устанавливая его на 0. Почему вы просто не помните фактический размер и избегаете перемещения по списку? Вероятно, вы должны сделать 'full' функцией' const'. Я не думаю, что «полный» действительно должен мутировать ваш список. Кроме того, 'tmp2' бесполезен. Вы могли бы просто написать 'tmp1 = tmp1-> next'. – sellibitze

+0

Как выглядит ваш метод push? Очевидно, что это одна из проблем с вашим кодом. –

ответ

0

Посмотрите на свой время цикла в полном объеме():

while(top != MaxSize) { 
     if(tmp1->next != NULL){ 
      tmp2 = tmp1->next; 
      tmp1 = tmp2; 
      ++top; 
     }//if 
    }//while 

Так что если у вас есть один элемент в списке ввода время цикла (предполагается, что top == 0?), и поскольку это первый узел в списке tmp1->next, это NULL, который держит верхнюю часть от инкремента, поэтому вы застреваете в цикле.

Вам также не нужно tmp2, вы можете использовать только tmp1 = tmp1 -> next;.

И чтобы исправить проблему, посмотрите на stat if, почему вы проверяете, чтобы следующий узел не был нулевым?

Кроме того, посмотрите в толчке():

void LinkList::push(int numIn) { 
    LinkNode * nodeIn = new LinkNode(numIn); 
    if(head == NULL) { 
     head = nodeIn; 
    }else { 
     nodeIn = head; 
     head = nodeIn; 
    } 
} 

Вы должны быть настройки nodeIn->next в head, перед тем, указывая на headnodeIn. То, как написано, новый узел никогда не добавляется в список.

+0

Я перепроверю его. – JDragon314159

0
int LinkList::full() { 
     int top = 0; 
     LinkNode * tmp1; 
     tmp1 = head; 
     while(top <= MaxSize && tmp1 != NULL) { 
       tmp1 = tmp1->next; 
       ++top; 
     }//while 
    return (top <= MaxSize); 
} 
+0

Стек не будет завершен в MaxSize. Я могу продолжать добавлять входные данные мимо параметра Maxsize? – JDragon314159