dk01 list

 创建列表

typedef struct node{
    void *val;
    struct node *next;
    struct node *prev;
} node;

typedef struct list{
    int size;
    node *front;
    node *back;
} list;

 void *val空指针可以被转换为任何类型,因此,list链表可以存储任意数据。

list *make_list()
{
    list *l = malloc(sizeof(list));
    l->size = 0;
    l->front = 0;
    l->back = 0;
    return l;
}

 

NULL 是空地址,地址为0的地址就是空地址,所以将0赋值给指针,指针就指向空地址

#define NULL ((void*)0)
Expands to:

((void*)0)

 

malloc分配指定长度的内存

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。

 

释放内存

void free_node(node *n)
{
    // 输入的node n是链表结构中的第一个(最前面的)node,因此是从前到后释放内存的,
    // 在释放每个node的之前,必须首先获取该node的下一个node,否则一旦过早释放,
    // 该节点之后的node将无从访问,无法顺利释放,这就可能造成内存泄漏
    node *next;
    // 遍历链表上所有的node,依次释放,直至n为空指针,说明整个链表上的节点释放完毕
    while(n) {
        // 释放n之前,首先获取n的下一个节点的指针,存至next中
        next = n->next;

        // 释放当前node内存
        free(n);
        // 将next赋值给n,成为下一个释放的节点
        n = next;
    }
}

 

 

测试

#include "head.h"
#include "list.h"

void test_list(){
    list *l1 = make_list();
    printf("init size:%d\n",l1->size);

    int a = 11;
    int *p = &a;
    node n1 = {p,NULL,NULL};
    list_insert(l1, &n1);
    printf("after size:%d\n",l1->size);
    free_list(l1);
}

int main(){

    test_list();

    return 0;
}

 

$ gcc cmain.c list.c -o ./out/ll
$ ./out/ll
init size:0
after size:1

 

posted @ 2022-02-23 14:09  方诚  阅读(32)  评论(0编辑  收藏  举报