2015-02-17 88 views
0

我想创建一个函数,将insert a node to the back of the list using linked list。我是新来的使用链表,我已经尝试了许多不同的方式在列表的末尾做插入,但似乎没有任何工作。 main传递值one at a time以插入2 4 5 8 9,输出为2 0 0 0 0。我不是什么导致这个问题。C++链接列表返回

.H

class Node 
{ 
public: 
    Node() : data(0), ptrToNext(NULL) {} 
    Node(int theData, Node *newPtrToNext) : data(theData), ptrToNext(newPtrToNext){} 
    Node* getPtrToNext() const { return ptrToNext; } 
    int getData() const { return data; } 
    void setData(int theData) { data = theData; } 
    void setPtrToNext(Node *newPtrToNext) { ptrToNext = newPtrToNext; } 
    ~Node(){} 
private: 
    int data; 
    Node *ptrToNext; //pointer that points to next node 
}; 

class AnyList 
{ 
public: 
    AnyList(); 
     //default constructor 
    void print() const; 
     //Prints all values in the list. 
    void destroyList(); 
     //Destroys all nodes in the list. 
    ~AnyList(); 
     //destructor 
    int getNumOfItems(); 
    void insertBack(int b); 
    void deleteFirstNode(); 

private: 
    Node *ptrToFirst; //pointer to point to the first node in the list 
    int count;  //keeps track of number of nodes in the list 
}; 

的.cpp

void AnyList::insertBack(int b) 
{ 
    Node *temp = new Node; 

    if (ptrToFirst == NULL) 
    { 
     temp->setData(b); 
     ptrToFirst = temp; 
    } 
    else 
    { 
     Node *first = ptrToFirst; 
     while (first->getPtrToNext() != NULL) 
     { 
      first = first->getPtrToNext(); 
     } 
     first->setPtrToNext(temp); 
    } 
} 
+0

我注意到你从来没有在您发布的代码初始化ptrToFirst为NULL。这将大大影响if(ptrToFirst == NULL)的逻辑,同时你也在它的初始化计数 – Diniden 2015-02-17 22:57:15

+0

这里是我的构造函数AnyList :: AnyList() \t ptrToFirst = NULL; \t count = 0; “我忘了把它插入帖子中。 – Nignig 2015-02-17 23:04:59

回答

1

首先,你真的应该使用std::liststd::forward_list类,而不是执行节点手动处理:

#include <list> 

class AnyList 
{ 
public: 
    void print() const; 
     //Prints all values in the list. 
    void destroyList(); 
     //Destroys all nodes in the list. 
    int getNumOfItems() const; 
    void insertBack(int b); 
    void deleteFirstNode(); 

private: 
    std::list<int> nodes; //nodes in the list 
}; 

void AnyList::print() const 
{ 
    for (std::list<int>::const_iterator iter = nodes.begin(); iter != nodes.end(); ++iter) 
    { 
     int value = *iter; 
     // print value as needed... 
    } 
} 

void AnyList::destroyList() 
{ 
    nodes.clear(); 
} 

void AnyList::getNumOfItems() const 
{ 
    return nodes.size(); 
} 

void AnyList::insertBack(int b) 
{ 
    nodes.push_back(b); 
} 

void AnyList::deleteFirstNode() 
{ 
    if (!nodes.empty()) 
     nodes.pop_front(); 
} 

话虽这么说,你的手工执行失败,因为你很可能没有正确管理节点(但你没有告诉你正在做的一切)。它应该是这个样子:

class Node 
{ 
public: 
    Node() : data(0), ptrToNext(NULL) {} 
    Node(int theData, Node *newPtrToNext) : data(theData), ptrToNext(newPtrToNext) {} 
    ~Node() {} 
    Node* getPtrToNext() const { return ptrToNext; } 
    int getData() const { return data; } 
    void setData(int theData) { data = theData; } 
    void setPtrToNext(Node *newPtrToNext) { ptrToNext = newPtrToNext; } 
private: 
    int data; 
    Node *ptrToNext; //pointer that points to next node 
}; 

class AnyList 
{ 
public: 
    AnyList(); 
     //default constructor 
    ~AnyList(); 
     //destructor 
    void print() const; 
     //Prints all values in the list. 
    void destroyList(); 
     //Destroys all nodes in the list. 
    int getNumOfItems() const; 
    void insertBack(int b); 
    void deleteFirstNode(); 

private: 
    Node *ptrToFirst; //pointer to point to the first node in the list 
    Node *ptrToLast; //pointer to point to the last node in the list 
    int count;  //keeps track of number of nodes in the list 
}; 

AnyList:AnyList() 
    : ptrToFirst(NULL), ptrToLast(NULL), count(0) 
{ 
} 

void AnyList::print() const 
{ 
    for (Node *temp = ptrToFirst; temp != NULL; temp = temp->getPtrToNext()) 
    { 
     int value = temp->getData(); 
     // print value as needed... 
    } 
} 

AnyList::~AnyList() 
{ 
    destroyList(); 
} 

void AnyList::destroyList() 
{ 
    Node *temp = ptrToFirst; 
    ptrToFirst = ptrToLast = NULL; 
    count = 0; 

    while (temp != NULL) 
    { 
     Node *next = temp->getPtrToNext(); 
     delete temp; 
     temp = next; 
    } 
} 

int AnyList::getNumOfItems() const 
{ 
    return count; 
} 

void AnyList::insertBack(int b) 
{ 
    Node *temp = new Node(b, NULL); 

    if (ptrToFirst == NULL) 
     ptrToFirst = temp; 

    if (ptrToLast != NULL) 
     ptrToLast->setPtrToNext(temp); 

    ptrToLast = temp; 
    ++count; 
} 

void AnyList::deleteFirstNode() 
{ 
    if (ptrToFirst == NULL) 
     return; 

    Node *temp = ptrToFirst; 
    ptrToFirst = temp->getPtrToNext(); 

    if (ptrToLast == temp) 
     ptrToLast = NULL; 

    delete temp; 
    --count; 
}