list.h:
#ifndef _DPI_LIST_H_
#define _DPI_LIST_H_
#include <stdint.h>
typedef struct dpi_list_node{
void *data;
struct dpi_list_node* prev;
struct dpi_list_node* next;
}dpi_list_node;
typedef struct dpi_list{
uint32_t size; // 链表当前长度
dpi_list_node sentinal; // 哨兵节点
}dpi_list;
dpi_list* dpi_list_create();
int dpi_list_append(dpi_list *list, void *data);
void dpi_list_destroy(dpi_list *list);
#endif
list.c
#include "list.h"
#include <stdlib.h>
#include <string.h>
dpi_list* dpi_list_create(){
dpi_list *list = malloc(sizeof(dpi_list));
if (list){
memset(list, 0, sizeof(*list));
// 哨兵节点, prev和next指针都指向自己
list->sentinal.next = &list->sentinal;
list->sentinal.prev = &list->sentinal;
}
return list;
}
int dpi_list_append(dpi_list *list, void *data){
dpi_list_node *node = malloc(sizeof(dpi_list_node));
node->data = data;
dpi_list_node *last_node = list->sentinal.prev;
// 新增尾节点操作
last_node->next = node;
node->prev = last_node;
node->next = &list->sentinal;
list->sentinal.prev = node;
return 0;
}
void dpi_list_destroy(dpi_list *list){
// 释放每个节点的数据区域、内存和链表结构体
dpi_list_node *begin = list->sentinal.next;
while(begin != &list->sentinal){
if (begin->data)
free(begin->data);
dpi_list_node *tmp = begin;
begin = begin->next;
free(tmp);
}
// 释放链表结构体
free(list);
}