如何在特定位置添加节点?

时间:2010-07-20 03:07:44

标签: c linked-list

我一直在使用双向链表。一切正常,可以免除应该在'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作为全局变量怎么办?如何在不返回头部的情况下重新分配头部?

3 个答案:

答案 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之前添加节点,则必须执行以下操作:

  1. "after"指针指向whereX
  2. 将“指针”指向“x {/ li>”的“before”指针
  3. 将whereX指向“before->after”的指针
  4. 将whereX指向“before”的指针
  5. 希望这有帮助。

    编辑:

    也进行适当的NULL检查