c - 如何销毁c中的链表?

标签 c

我有这个节点:

typedef struct node {
    DATA *dataa ;
    struct node* next;
} *node_v;

假设我已经填充了链接列表..我现在想检查它并销毁它.. 我已经创建了这个函数来销毁:

void destroyList(Node ptr) {
    while(ptr) {
        Node toDelete = ptr;
        ptr = ptr->next;
        free(toDelete);
    }
}

它需要一个节点并释放它。但我的问题是,我将每个节点的下一个指向 NULL,而前一个节点指向新节点! 但 destroylist 函数的作用相反。这意味着为了删除一个节点,我用我输入的最后一个节点调用函数 destroy list,但 toDeleate 也指向它,而我输入的最后一个节点现在指向下一个节点在我的例子中它是空的,所以我想做相反的事情..任何关于 hiw 的想法我都可以做到这一点! 就像我怎样才能创建一个相反方向的销毁函数!?

最佳答案

I call the function destroy list with the the last node I entered ... how can I make a destroy function that goes in the opposite direction?

对于单链表,您只能选择一个方向,即链接指向的方向。 听起来就像构建后列表的状态是这样的:

                          pointer
                             |
                             V
firstVal -> secondVal -> thirdVal -> NULL

然后调用destroyList(pointer)。这不是单链表所需要的。这样的列表应该维护一个指向列表开始的头指针,如下所示:

 pointer
    |
    V
firstVal -> secondVal -> thirdVal -> NULL

如果您要像这样构建列表,那么用于销毁列表的代码就可以正常工作。

由于您实际上没有显示构建列表的代码(而是仅给出构建后的所述列表的描述),所以这很可能是您的问题。

为了正确构建列表,您可以使用伪代码,例如:

head = null
def append(head, tail, node):
    node.next = null
    if head == null:
        head = node
        tail = node
        return
    tail.next = node
    tail = node

关于c - 如何销毁c中的链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43999847/

相关文章:

C:比较结构中的两个字符串

c++ - 如何修复此语句可能会通过 [-Werror=implicit-fallthrough=]?

objective-c - 如何将未知大小的二维数组作为方法参数传递

c - C 互操作的原始指针

c - 毕达哥拉斯三胞胎

c - 从文件中读取数据并将其写入链表

c - 如何使用socket编程在c中找到客户端地址

c - 在辅助函数上用字符串填充数组。为什么它会打印乱码?

c - Lex 中的模式

C,我想将 3 个参数传递给 bash 脚本,我是 c 菜鸟