当前位置: 代码迷 >> C++ >> 小弟写的链表析构函数不知道为何陷入死循环,请高人能指点;不胜感谢
  详细解决方案

小弟写的链表析构函数不知道为何陷入死循环,请高人能指点;不胜感谢

热度:1110   发布时间:2013-02-26 00:00:00.0
小弟写的链表析构函数不知道为什么陷入死循环,请高人能指点;不胜感谢
//////////////////////list.h/////////////////////////////
#ifndef _LIST_H_
#define _LIST_H_

class ListNode {
private:
        int myValue;
        ListNode* myNext;
public:
        ListNode (int k):myValue(k), myNext(0) {}
        ListNode (int k, ListNode* ptr):myValue(k), myNext(ptr) {}
        ~ListNode ();
        int First () {return myValue;}
        ListNode* Reset () {return myNext;}
        void Print (){};
};

#endif

////////////////////////////list.cpp///////////////////////
ListNode::~ListNode () {
    ListNode* temp = 0;
    cout << "Delete node of value " << myValue << endl;
    ListNode* ptr = this;
    while (ptr) {
        temp = ptr->myNext;
        delete ptr;
        ptr = temp;
    }
}

//////////////////////////////main().cpp/////////////////
#include <iostream>
#include "List.h"
using namespace std;

ListNode* FromInput (istream &is) {
    ListNode* head = 0;
    int k;
    while (is >> k) {
        head = new ListNode (k, head);
    }
    return head;
}

int main () {
    ListNode* list = FromInput (cin);
    list->Print();
    if (list) {
        delete list;
    }
    return 0;
}
小弟输入3,4,5就陷入死循环不停输出Delete node of value 5,小弟真心没找到问题所在,请高人指点。谢谢

------解决方案--------------------------------------------------------
ListNode* ptr = head;才行,你的链表没有头指针吧。
------解决方案--------------------------------------------------------
头指针没问题。问题是这里:
    while (ptr) {
         temp = ptr->myNext;
         delete ptr;
         ptr = temp;
     }
这句delete会递归调用ListNode::~ListNode
------解决方案--------------------------------------------------------
楼主,你的析构函数中循环的判断条件是ptr是否为NULL,而你的FromInput 函数中并没有将链表的最后一个节点的myNext置为NULL,所以才会死循环。
建议如下修改,我没有测试是否OK,但大致意思就是那样,楼主再看看。
//////////////////////list.h/////////////////////////////
#ifndef _LIST_H_
#define _LIST_H_

class ListNode {
private:
        int myValue;
        ListNode* myNext;
  相关解决方案