创建列表
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