使用递归的2-D链接列表复制构造函数

时间:2017-03-27 21:21:58

标签: c++ recursion linked-list

我正在尝试制作一个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
}

1 个答案:

答案 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.
}