2012-01-28 2 views
0

В моем коде есть ошибка сегментации. что не так? заранее спасибо. p.s - это стек с использованием связанного списка.стек с помощью связанного списка

#include <iostream> 
//stack using linked list 
class LinkedList { 
public: 
    LinkedList() : head(0), tail(0) {} 
    ~LinkedList() { 
    while (!empty()) pop(); 
    delete head; 
    } 
    void pop() { 
    node* temp; 
    temp = head; 
    for (; temp->next_ != tail; temp = temp->next_) { 
     tail = temp; 
    } 
    delete temp; 
    tail->next_ = 0; 
    } //removes, but does not return, the top element 
    int top() { 
    return tail->value_; 
    } //returns, but does not remove, the top element 
    bool empty() { 
    return head == 0; 
    } 
    void push(const int& value) { 
    node* element = new node(value); 
    if (empty()) { 
     head = tail = element; 
    } else { 
     tail->next_ = element; 
     tail = element; 
    } 
    } //place a new top element 
private: 
    class node { 
    public: 
    node(const int& input) : value_(input), next_(0) {}; 
    int value_; //store value 
    node* next_; //link to the next element 
    }; 
    node* head; 
    node* tail; 
}; 
int main() { 
    LinkedList list; 
    list.push(1); 
    list.push(2); 
    list.push(3); 
    list.pop(); 
    std::cout << list.top() << std::endl; 
    return 0; 
} 
+1

Пробовал ли вы отлаживать код с помощью 'gdb'? –

+3

Вам пришло в голову, что вы должны сказать, где ваш код разбился? –

ответ

2

Эта часть не выглядит правильно

for (; temp->next_ != tail; temp = temp->next_) { 
    tail = temp; 
} 

, потому что как только вы установите tail быть таким же, как temp, temp->next != tail всегда будет правдой.

+0

Это дает мне правильный ответ. но он говорит: «двойная свобода или коррупция», – ihm

1
for (; temp->next_ != tail; temp = temp->next_) { 
     tail = temp; 
} 

условие должно быть

temp->next_ != 0 
0

Проблема я думаю:

for (; temp->next_ != tail; temp = temp->next_) { 
    tail = temp; 
} 
delete temp; 
tail->next_ = 0; 

хвост = температура должна быть после того, как вы найдете температуру, что приводит к хвосту (т.е. вне цикл for). Кроме того, temp = не хвост, а один перед хвостом. Так, вероятно, вам нужно:

for (; temp->next_ != tail; temp = temp->next_) {} 
delete tail; 
tail = temp; 
tail->next_ = 0; 
1

Этот метод

void pop() { 
    node* temp; 
    temp = head; 
    for (; temp->next_ != tail; temp = temp->next_) { 
     tail = temp; 
    } 
    delete temp; 
    tail->next_ = 0; 
    } //removes, but does not return, the top element 

должно быть так:

void pop() { 
    if(head == tail) 
    { 
     delete head; 
     head = 0; 
    } 
    else 
    { 
     node* temp; 
     temp = head; 
     for (; temp->next_ != tail; temp = temp->next_) { 
     } 
     delete tail; 
     temp->next_ = 0; 
     tail = temp; 
    } 
    } //removes, but does not return, the top element 
0

Деструктор выглядит багги мне: вы держите "выскакивают", пока пустой() возвращает true, что происходит, когда head является нулевым указателем. Но тогда вы не можете вызвать delete на голове после того, как цикл while закончится ...

Я не знаю, если это проблема, но я бы это проверил.

Еще один скромный совет: вы не сказали нам, где произошла ошибка seg ... Если вы запустите свой код с помощью gdb (или если вы просто положили много «cout» в свой код), вы можете обнаружить которая вызывает проблемы.

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