我正在独立学习C ++列表,并且我搜索了很多关于它的网站。但是,几乎所有创建列表的方法都是相同的
他们通常会创建一个struct
作为class
的节点。我想在不使用class
的情况下创建struct
。所以我创建了一个类名ListNode
,其中包含int
数据和指针
我班级的主要成员功能是AddNode
和show
。
虽然这个程序编译成功,但它仍然无法正常工作。
这是头文件:
#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
但是,输出是单个零。 AddNode
和show
函数中必定存在错误。
请告诉我这两个功能有什么问题?
答案 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
现在真正的头部,不是函数中的头部,将指向您插入的最后一个节点。