0

我有一个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); 
}
4

1 回答 1

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 的特殊情况,或空列表等。

于 2012-09-25T16:48:59.163 回答