【问题标题】:Deleting node from linked list in C从C中的链表中删除节点
【发布时间】:2014-11-19 17:41:00
【问题描述】:

我试图理解从链表中删除节点,所以我创建了如下所示的函数Node *deleteNode(int item. Node *head)。它确实删除了一个节点,但不是我在 main 函数中指定的那个。如果我从 (1,2,3,4,5,6) 的链接 lsit 开始,它将返回 (1,3,4,5,6) 的列表。所以它总是出于某种原因删除第二个节点。导致此问题的 deleteNode 函数中的错误是什么?

【问题讨论】:

  • 您是否尝试过使用调试器?提示=== 不同
  • 另外,在deleteNode 中,您永远不会修改head。那么当您尝试删除列表的头部时会发生什么?您将返回与以前相同的head(您刚刚删除的节点)。您需要处理删除列表头部的情况。

标签: c linked-list nodes


【解决方案1】:

使用链表并摸索指针和节点,了解哪个指针指向什么以及链表的总体布局是非常重要的。当我试图向某人解释它时,我经常在我的白板上画一幅画。只需绘制一个带有一些节点和连接它们的指针的小图。通过这种方式,您可以非常快速地看到哪些指针必须重定向到其他节点才能从列表中删除节点。

简而言之:通过绘图,它可以非常清楚地做什么,如果你知道该怎么做,编码实际上并不难。

【讨论】:

    【解决方案2】:

    您需要真正考虑您的列表如何操作才能删除节点。我肯定会考虑从您的 deleteNode 中删除几块,以便它流动得更顺畅。请考虑以下几点:

    Node *deleteNode(int item, Node *head){
        Node * current = head, *pTemp = NULL, *pPrev = NULL;
    
    while((current->link->info != item) && ((current -> link != NULL)) //You want to traverse the list until you find the item.
    {      
      pPrev = current; // Assign previous pointer which is null to head of list and so on.
      current = current->link // Assign current pointer to next node.
    }
    
    if (current->link-> info == item )
    {
      pTemp = current; // Assign temp pointer to current pointer
      current = pTemp->link; // set current to next pointer
      pPrev->link = current; // set previous pointer to current
      free (pTemp)
    }
    else
    {
     // Did not find at all in list.
    }
    
    return head;
    

    }

    这一切都是通用的,并且在运行中,请调试您的代码并在纸上写下您的列表结构。

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 2013-08-30
      • 2019-05-10
      • 1970-01-01
      • 2021-02-21
      • 2016-01-02
      • 2016-03-02
      • 1970-01-01
      • 2013-01-08
      相关资源
      最近更新 更多