带有递归故障的链接列表插入

时间:2018-02-21 21:22:56

标签: c++ recursion linked-list

所以我试图在列表容器类中用C ++创建一个链表。 list类包含成员头(一个节点)和insert函数,而node类包含我需要添加的数据(名字,姓氏,年龄)。但是,我不认为我实际上是在创建一个列表,而只是在输入循环中写入p

这是主程序中从文件中读取数据的while循环

while(!infile.eof())
    { infile >> first >> last >> age;

// Process if okay

      if(infile.good())
        a.insert(first,last,age);
    };

这是实际的插入函数定义

void list::insert(string first, string last, int age)

{
    node *p;
    p = new node;
    p->first = first;
    p->last = last;
    p->age = age;
    if (head == NULL)
    {
        head = p;
        head->put(cout);
    } else
    {
        if (head->next != NULL)
        {
            head->put(cout);
            insert((p->next)->first, (p->next)->last, (p->next)->age);
        } else
        {
            p->next = p;
            p->put(cout);
        }
    }
}

我无法更改Node标头或主程序,因此我需要在函数调用中使用这些参数。有任何想法吗?

1 个答案:

答案 0 :(得分:0)

当列表为空时,在链表中插入节点很简单。

head = p;

你已经完成了。

当列表不为空时,在链表的末尾插入一个节点有点牵扯。以图示方式,我们说你有:

Current Linked List

并且您希望在结尾添加新节点。您需要在现有链接列表的最后一个节点和新节点之间建立链接,以便最终得到:

New Linked List

为了能够做到这一点,你必须走链表才能到达最后一个节点。然后,您可以使用:

lastNode->next = p;

你已经完成了。

忽略创建输出的调用,这是你的函数的样子。

void list::insert(string first, string last, int age)
{
   node *p = new node;
   p->first = first;
   p->last = last;
   p->age = age;

   if (head == nullptr)
   {
      // The simple case
      head = p;
   }
   else
   {
      // Gather the last node in the linked list.
      node* lastNode = head;
      while ( lastNode->next != nullptr )
      {
         lastNode = lastNode->next;
      }

      lastNode->next = p;
   }
}

使用递归插入节点看起来非常不同。这是一个未经考验的建议:

void list::insert(node*& ptr, node* p)
{
   if ( ptr == nullptr )
   {
      ptr = p;
   }
   else
   {
      insert(ptr->next, p);
   }
}

void list::insert(string first, string last, int age)
{
   node *p = new node;
   p->first = first;
   p->last = last;
   p->age = age;

   insert(head, p);
}

我不推荐使用递归方法。它不仅消除了算法的可读性,而且在运行时也更加昂贵。如果你有一个包含大量项目的链表,它甚至可能导致堆栈溢出。