[英]stack using linked list
我的代碼中出現“細分錯誤”。 怎么了? 提前致謝。 ps這是使用鏈表的堆棧。
#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;
}
這部分看起來不正確
for ( ; temp->next_ != tail; temp = temp->next_) {
tail = temp;
}
因為一旦將tail
設置為與temp
相同, temp->next != tail
將始終為true。
for ( ; temp->next_ != tail; temp = temp->next_) {
tail = temp;
}
條件應該是
temp->next_ != 0
這個方法
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
我認為的問題是:
for ( ; temp->next_ != tail; temp = temp->next_) {
tail = temp;
}
delete temp;
tail->next_ = 0;
tail = temp應該在找到導致尾部的溫度之后(即,在for循環之外)。 另外,temp =不是尾巴,而是尾巴前的那個。 所以可能您需要:
for ( ; temp->next_ != tail; temp = temp->next_) {}
delete tail;
tail = temp;
tail->next_ = 0;
析構函數對我來說似乎很麻煩:您一直“彈出”,直到empty()返回true,這種情況會在head為null指針時發生。 但是,當while循環結束后,您將無法再調用delete ...
我不知道這是否是問題,但我會檢查一下。
另一個謙卑的提示:您沒有告訴我們seg錯誤發生的位置...如果您使用gdb運行代碼(或者如果您在代碼中放入了很多“ cout”),則可以檢測到導致您出現錯誤的行問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.