【问题标题】:C delete linked list nodeC 删除链表节点
【发布时间】:2021-07-25 23:56:30
【问题描述】:

我用 C 写链表

第一个创建的节点的下一个(node->next)是NULL

最后创建的节点是 HEAD。 (倒序)

我创建了 3 个节点 a, b, c

我想删除 b 节点

这是我的代码:

struct node {
    char *name;
    void *data;
    int size;
    struct node *next;
};

typedef struct node Node;

void remove_data(Node *node, char* d_name) {
    
    while (node != NULL) {
        // remove data from heap
        
        if (strcmp(node->next->name, d_name) == 0) {
            node->next = node->next->next;
            printf("remove %s\n", node->next->name);
            printf("%s -> %s\n", node->name, node->next->name);
            free(node->next);
            break;
        } else {
            node = node->next;
        }
    }
}

并调用此函数remove_data(head, d_name); 我预测这个程序会打印

remove b
a -> c

但它会打印出来

remove b
b -> b

这是为什么呢?

【问题讨论】:

  • 顺便说一句:为什么要将字符串d_namenode->next->name 进行比较?如果头节点包含您正在搜索的文本,您将永远找不到它。为什么不与node->name 比较呢?此外,如果remove_data 删除了头部,它需要某种方式将新头部传递给调用者。
  • 请完成一个完整的例子。您没有显示您的节点/列表结构,您没有显示您如何构建列表。
  • @lulle:您可能正在寻找[ m r e ](没有空格)。它扩展为:minimal reproducible example
  • 啊,谢谢。我怎么不知道呢哈哈。无论如何,正如 AndreasWenzel 所提到的,如果你使用 compare to 'node->next->name' 你 a) 如果 'head' 包含它,你将永远找不到文本,而且可以说更糟糕的是,b) 'node->next' 可能为 NULL。

标签: c struct linked-list singly-linked-list function-definition


【解决方案1】:

无论如何,你的功能没有意义。

首先,由于比较,它忽略了存储在第一个(头)节点中的名称

strcmp(node->next->name, d_name) == 0
       ^^^^^^^^^^^^^^^^

对于仅包含一个节点的列表,不能调用该函数。

这次分配之后

node->next = node->next->next;

指向要删除的节点的指针丢失了。

也不清楚这些数据成员是什么

    void *data;
    int size;

意思是你是否还需要释放指针data指向的内存。

函数可以通过如下方式声明和定义,如下所示。函数定义基于您的函数定义。如果需要,那么您还应该插入语句

free( current->data );

之前

free( current );

这是函数定义。

int remove_data( Node **node, const char *d_name )
{
    while ( *node != NULL && strcmp( node->name, d_name ) != 0 )
    {
        node = &( *node )->next;
    }

    int success = *node != NULL;

    if ( success )
    {
        Node *current = *node;
        *node = ( *node )->next;
        free( current );
    }

    return success;
}

当你调用函数时,你必须将指向头节点的指针传递给函数。

即指向头节点的指针必须通过引用传递。在这种情况下,如果删除的节点将是头节点,那么指向头节点的原始指针将被更新。否则该函数将处理指向头节点的指针的副本,并且更改副本不会影响存储在原始指针中的值。

【讨论】:

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