添加到链表C的后面

时间:2014-03-28 19:40:48

标签: c linked-list

我正在尝试创建一个接受结构的函数,然后将该结构添加到链接列表的后面。我已经想出了如何添加到前面,但我无法将头部包裹在后面。

这是我添加到前台功能:

MusicRec * addToFront(MusicRec * theList, MusicRec * toBeAdded)
{
toBeAdded->next = theList;
theList = toBeAdded;
return(theList);
}

我假设添加到列表后面非常类似于添加到前面,我似乎无法将逻辑降低

2 个答案:

答案 0 :(得分:2)

您需要先将列表遍历到最后,然后添加新链接,如下所示:

MusicRec *addToBack(MusicRec *theList, MusicRec *toBeAdded)
{
    MusicRec *ptr = theList;
    if (!ptr) return toBeAdded;
    while (ptr->next)
        ptr = ptr->next;
    ptr->next = toBeAdded;
    return theList;
}

答案 1 :(得分:1)

一些递归方法:

Naive,O(n)堆栈内存:

node *add_tail(node *list, node *added)
{
   if (list == NULL)
     return added;
   list->next = add_tail(list->next, added);
   return list;
}

包装器加尾递归函数(可优化循环):

void add_tail_rec(node **list, node *add)
{
   if (*list == NULL)
     *list = add;
   else
     add_tail_rec(&(*list)->next, add);
}

node *add_tail(node *list, node *add)
{
   add_tail_rec(&list, add);
   return list;
}

使用假头节点而不是指向指针:

void add_tail_rec(node *list, node *add)
{
   if (list->next == NULL)
     list->next = add;
   else
     add_tail_rec(list->next, add);
}

node *add_tail(node *list, node *add)
{
   node fake;
   fake.next = list;
   add_tail_rec(&fake, add);
   return fake.next;
}

没有伪头节点或指向指针的指针,但是null测试的副本被提升到包装器中:

void add_tail_rec(node *list, node *add)
{
   if (list->next == NULL)
     list->next = add;
   else
     add_tail_rec(list->next, add);
}

node *add_tail(node *list, node *add)
{
   if (list == NULL)
      return add;
   add_tail_rec(list, add);
   return list;
}

在递归函数跟踪插入位置中使用额外的上下文参数。有了这个技巧,递归部分返回一个值:该值始终只是list!包装器可以使用三元表达式返回addlist(添加项目)。

node *add_tail_rec(node *list, node *add, node *where)
{
   return where->next == NULL 
          ? (where->next = add, list) 
          : add_tail_rec(list, add, where->next);
}

node *add_tail(node *list, node *add)
{
   return list == NULL ? add : add_tail_rec(list, add, list);
}