使用自定义链接列表实现获取错误输出

时间:2016-03-05 02:37:30

标签: c++ list pointers

我正在独立学习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;
}    

就我而言,输出应为

2

1

0

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

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

1 个答案:

答案 0 :(得分:0)

当你调用head-&gt; 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()中的指针头始终指向您在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

现在真正的头部,不是函数中的头部,将指向您插入的最后一个节点。