我一直在使用双向链表。一切正常,可以免除应该在'whereX'之前添加'who'副本的函数[参见下面的代码]。为什么功能不起作用?
void addNodeAt(Node *whereX, Node *who)
{
//copy
Node *temp = (Node*)malloc(sizeof(Node));
temp->count = who->count;
strcpy(temp->word,who->word);
temp->before = whereX->before;
temp->after = whereX;
//paste
if(whereX->after == who)
whereX->after = who->after;
whereX->before = temp;
}
编辑:
回应user326404谁说:
'注意:您的函数确实存在一个缺陷,导致它无法插入作为列表新头的人。它将插入,但您永远不会返回新的头节点,因此列表将丢失。'
如果我将Node * head作为全局变量怎么办?如何在不返回头部的情况下重新分配头部?
答案 0 :(得分:2)
您不会让现有链接了解新创建的临时节点。将以下代码添加到函数末尾,以使链的前一部分指向新创建的节点。
if (whereX->before != NULL)
whereX->before->after = temp;
注意:您的函数确实存在一个缺陷,导致它无法插入who
作为列表的新头部。它将插入,但您永远不会返回新的头节点,因此列表将丢失。
答案 1 :(得分:1)
假设你有这个清单:
[Node1] <-> [WhereX] <-> [Node2]
从这些作业:
Node *temp = (Node*)malloc(sizeof(Node));
temp->count = who->count;
strcpy(temp->word,who->word);
temp->before = whereX->before;
temp->after = whereX;
从此:
whereX->before = temp;
你将拥有:
[Node1] <- [temp] <-> [WhereX] <-> [Node2]
| ^
----------------------
但是Node1的after
指针仍在查看WhereX,所以
你还应该添加这个作业:
whereX->before->after = temp;
答案 2 :(得分:0)
你在做什么需要一些改变。您已正确分配内存以进行复制。 但问题陈述不是很清楚。
假设您要在whereX之前添加节点,则必须执行以下操作:
"after"
指针指向whereX before
”指针
before->after
”的指针before
”的指针希望这有帮助。
编辑:
也进行适当的NULL检查