【问题标题】:Delete a single node passed to a function in a linked list C删除传递给链表 C 中函数的单个节点
【发布时间】:2012-09-25 16:27:14
【问题描述】:

我有一个函数deleteNode,它接收列表的头部和要删除的节点。当我运行它时,它成功删除了节点,但它也删除了它之后的所有内容。我相信这与我重建列表有关,但我无法弄清楚我的逻辑在哪里出错,所以我可以使用一些帮助。函数代码如下:

void deleteNode(struct lnode** head, struct lnode* node) {
    struct lnode* nextNode = nodeGetNext(node);
    printf("word: \n%s\n",nodeGetWord(nextNode));
    struct lnode* nodeToDelete = node;


    *head = nodeGetNext(nodeToDelete);
    printf("Head word: %s\n",nodeGetWord(*head));
    free(nodeToDelete); 
}

【问题讨论】:

  • 嗯,您似乎没有将删除后的节点重新链接到之前的节点?我说的对吗?
  • 假设你的列表是 H->...->P->D->N->...,H 是头部,D 是要删除的节点。您首先必须从 P 中取消链接 D 并将 P 链接到 N。当您必须删除头或最后一个节点时要小心...
  • 发布struct lnode 的定义以获得更有用的答案。
  • 也只是从查看这一点并做出一些假设,看起来它删除了要删除的节点之前的所有内容,因为您将头指向要删除的节点之后的节点

标签: c list linked-list


【解决方案1】:

试着画出来……我不知道你的函数到底是做什么的,所以这会根据名字做出一些假设,但你可以理解。

  1. 你传入head(红色'h')
  2. 你传入node删除(蓝色'n')
  3. 您将本地 nextNode 设置为 nodeGetNext(node) 的返回值(我假设这是要删除的节点之后的节点,绿色的“nn”)
  4. 您将nodeToDelete(紫色ntd)设置为node

所以你的代码将指向nodeGetNext(nodeToDelete)。这实际上是您未使用的变量nextNode。然后你释放nodeToDelete

我很确定这不是您想要做的,除非您知道要删除的节点就在 head 旁边。我认为更正常的算法是:

  1. 从头搜索要删除的节点
  2. 在“要删除的节点”+1旁边设置“要删除的节点”-1
  3. 删除“要删除的节点”

Head 的特殊情况,或空列表等。

【讨论】:

  • 类似于this?
  • @MattAltepeter - 很好,是的,这些答案中的任何一个都可以,它们都在正确更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多