首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-02-15 
小弟写的链表析构函数不知道为什么陷入死循环,请高人能指点;不胜感谢//////////////////////list.h///////

小弟写的链表析构函数不知道为什么陷入死循环,请高人能指点;不胜感谢
//////////////////////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;


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 SetLink(List* next){myNext = next;}//增加一个函数,链接下一个节点
        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;
    }
}

ListNode* FromInput (istream &is) {
    ListNode* head = NULL;
int k;
if(is >> k)
{
head = new ListNode(k);
}
    ListNode* node = head;
    while (is >> k) {
        node->SetLink( &LinkNode(k) );//链接下一个节点(下一个节点的myNext是NULL)
node = node->Reset();//将临时节点设置为下一个节点
    }
    return head;
}

热点排行