我正在尝试制作一个2-d单链表,其中每个节点都有一个右指针和一个指针。我实现了复制构造函数时遇到了很多麻烦,因为我很确定递归是要走的路,而且我在递归时非常糟糕。我需要更改您看到的任何内容,还是看起来不错?
以下是标题中的声明:
typedef int elementType;
struct node;
typedef node* nodePtr;
struct node
{
elementType elt;
nodePtr right = NULL;
nodePtr below = NULL;
};
class LinkedList
{
protected:
nodePtr head, tail;
int size;
public:
LinkedList();
LinkedList(const LinkedList &list); // copy constructor
void recursiveCreate(nodePtr ptr);
}
这是我的cpp文件
LinkedList::LinkedList(const LinkedList &list)
{
nodePtr current = NULL;
if (list.head == 0)
head == 0;
else
{
current = list.head;
recursiveCreate(current);
}
}
void LinkedList::recursiveCreate(nodePtr ptr)
{
nodePtr n = new node; //create new node
n->elt = ptr->elt; //copy value into that new node
n->right = ptr->right; //move right n pointer
n->below = n->below; //move right below pointer
recursiveCreate(ptr->right); //call on right node
recursiveCreate(ptr->below); //call on below node
}
答案 0 :(得分:1)
前面的大事:这是二叉树,而不是链表。将其称为链接列表只会导致混淆。
在主题上,递归不是链接列表的方法。对于一棵树它可能是。但是你有什么不起作用的原因有几个。
1)没有终止条件。递归将犁入NULL指针并做坏事。如果recursiveCreate
为NULL,则首先在nodePtr
中退出。
2)您正在设置当前节点以指向错误的内容。例如,
n->right = ptr->right;
让节点指向错误列表中的节点。这几乎是一个糟糕的结局。您想指向recursiveCreate
创建的节点。
让我们来看看它会是什么样子:
nodePtr LinkedList::recursiveCreate(nodePtr ptr)
{
if (ptr == nullptr)
{
return nullptr; // source tree stops here
}
nodePtr n = new node; //create new node
n->elt = ptr->elt; //copy value into that new node
n->right = recursiveCreate(ptr->right); //call on right node
n->below = recursiveCreate(ptr->below); //call on below node
return n;
}
和
LinkedList::LinkedList(const LinkedList &list)
{
nodePtr current = nullptr;
if (list.head == nullptr) // NAG!!! For Crom's sake! 0 is not a pointer!
head == nullptr; // Use nullptr and get type checking working for you.
else
{
head = recursiveCreate(list.head);
}
}
特别奖金运营商
LinkedList & operator=(LinkedList list) // pass by reference. Copy constructor copies
// for you
{
std::swap(head, list.head); // steal head from copy and give copy the empty
return *this; // all done.
}