簡體   English   中英

使用鏈表堆疊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM