【问题标题】:How to add a node in a specific location?如何在特定位置添加节点?
【发布时间】:2010-07-20 03:07:43
【问题描述】:

我一直在使用双向链表。除了应该在“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 说:

'注意:你的函数确实存在一个缺陷,它无法将 who 作为列表的新头插入。它会插入,但您永远不会返回新的头节点,因此列表会丢失。'

如果我有一个 Node *head 作为全局变量会怎样。我怎样才能在不退回头部的情况下重新签名?

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

    您不会让现有链接知道新创建的临时节点。将以下代码添加到函数末尾,让链的前面部分指向新创建的节点。

    if (whereX->before != NULL)
        whereX->before->after = temp;
    

    注意:您的函数确实存在一个缺陷,导致它无法将who 作为列表的新头插入。它会插入,但您永远不会返回新的头节点,因此列表会丢失。

    【讨论】:

    • 如果我不想返回新的 head 并且我有一个 Node *head 作为全局变量怎么办。我该如何修复这个缺陷?
    • 使用一个全局变量保存头部,你需要释放()旧头部,然后将其指向新头部。
    • M... 这很有趣。我刚刚拥有的全局变量“head”指向列表的第一个节点和列表的最后一个节点,因此“whereX”和“who”永远不会是头。有点像一座桥。
    【解决方案2】:

    假设您有以下列表: [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;
    

    【讨论】:

      【解决方案3】:

      你正在做的事情需要一些改变。您已正确分配要复制的内存。 但是问题陈述不是很清楚。

      假设你想在 whereX 之前添加一个节点,你必须执行以下操作:

      1. 指向 "after" 指向 whereX 的 temp 指针
      2. 将 temp 的“before”指针指向 whereX 的“before”指针
      3. 将 whereX 的“before-&gt;after”指针指向 temp
      4. 将 whereX 的“before”指针指向 temp

      希望这会有所帮助。

      编辑:

      同时进行适当的 NULL 检查

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 1970-01-01
        • 2015-02-15
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多