2016-03-05 72 views
-2

我在C++中独立学习列表,并且我已经搜索了许多关于它的网站。但是,几乎每种创建列表的方法都是一样的。
他们通常创建一个struct作为class的节点。我想创建一个class而不使用struct。于是我创建了一个类名ListNode,其中包含一个int数据和一个指针。
我班的主要成员功能是AddNodeshow使用自定义链表实现获取错误的输出

虽然这个程序编译成功,但它仍然无法正常工作。

这里是头文件:

#ifndef LISTNODE_H_ 
#define LISTNODE_H_ 
#pragma once 
class ListNode 
{ 
private: 
    int data; 
    ListNode * next; 

public: 
    ListNode(); 
    ListNode(int value); 
    ~ListNode(); 
    void AddNode(ListNode* node,ListNode* headNode); 
    void show(ListNode* headNode); 
}; 

#endif 

这里是实现:

#include "ListNode.h" 
#include<iostream> 


ListNode::ListNode() 
{ 
    data = 0; 
    next = NULL; 
} 

ListNode::ListNode(int value) 
{ 
    data = value; 
    next = NULL; 
} 


ListNode::~ListNode() 
{ 

}  

void ListNode::AddNode(ListNode* node,ListNode* headNode) { 
    node->next = headNode; 
    headNode =node; 
} 

void ListNode::show(ListNode* headNode) { 
    ListNode * traversNode; 
    traversNode = headNode; 
    while (traversNode != NULL) { 
     std::cout << traversNode->data << std::endl; 
     traversNode = traversNode->next; 
    } 

} 

主要功能:

#include"ListNode.h" 
#include<iostream> 
int main() 
{ 
    using std::cout; 
    using std::endl; 
    ListNode* head = new ListNode(); 
    for (int i = 0;i < 3;i++) { 
     ListNode* Node = new ListNode(i); 
     head->AddNode(Node, head); 
     } 
    head->show(head); 
    return 0; 
}  

就我而言,输出应该是

但是,输出是单个零。在AddNodeshow函数中肯定有错误。

你能告诉我这两个功能有什么问题吗?

+1

如果你拿出一些纸和铅笔,并逐步浏览你的代码,一次一行,你会看到问题。或者,如果您的纸张用完了,则可以使用平台的调试器手动逐步执行代码,并查看所有变量的值。这不是一个非常复杂的程序。调试它不需要很长时间。 –

+0

我已经调试过它,但是因为我很安静,新的C++我只知道这两个函数是错误的,但我不知道为什么AddNode函数无法链接列表中的节点。 – Tom

+1

如果你真的调试过它,那么你应该能够回答一个简单的问题:在第一次调用AddNode()之后,以及在第二次调用AddNode()之后,你对head-> next看到了什么值。 –

回答

0

当你调用head-> AddNode(node,head)时,你传递指针指向的内存方向,当函数参数接收到这些方向时,它们现在指向相同的方向,但这些是另一个指针,没有你主要宣布的那些。你可以看到这样的:

void ListNode::AddNode(ListNode* node,ListNode* headNode) { 
    /*when the arguments get their value it could be seen as something like: 
     node = Node(the one from main) 
     headNode = head(the one from main)*/ 
    node->next = headNode; 
    /*Here you are modifying the new inserted node, no problem*/ 
    headNode = node; 
    /*The problem is here, you´re modifying the memory direction 
     headNode points to, but the headNode argument of the function, no the one declared in main*/ 
} 

使指针头在main()总是指向你的主也宣告了相同的第一个节点()。

为了解决这个问题,你应该改变你的代码是这样的:

void ListNode::AddNode(ListNode* node,ListNode** headNode) { 
/* second paramater now receives a pointer to apointer to a node */ 

    node->next = *headNode;//the same as before but due to pointer syntaxis changes a bit 
    *headNode = node;//now you change the real head 
} 

当你骂它:

head->AddNode(Node, &head);//you use '&' before head 

现在,真正的头,没有一个在功能,将指向你插入的最后一个节点。