我正在尝试创建一个接受结构的函数,然后将该结构添加到链接列表的后面。我已经想出了如何添加到前面,但我无法将头部包裹在后面。
这是我添加到前台功能:
MusicRec * addToFront(MusicRec * theList, MusicRec * toBeAdded)
{
toBeAdded->next = theList;
theList = toBeAdded;
return(theList);
}
我假设添加到列表后面非常类似于添加到前面,我似乎无法将逻辑降低
答案 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
!包装器可以使用三元表达式返回add
或list
(添加项目)。
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);
}