链表
链表由一组元素,以一种特定的顺序组合或者链接在一起
相对数组,链表在执行插入、删除操作时具有更高的效率
链表需要动态的开辟存储空间,也就是存储空间在程序运行时是动态分配的
链表类型:单向链表、双向链表、循环链表
单向链表
list_init
void list_init(List *list, void (*destroy)(void *data));
/*
初始化由参数list指定的链表
参数destroy为函数指针,提供了一种释放动态分配数据的方法
*/
list_destroy
void list_destroy(List *list);
/*
销毁由参数list指定的列表
*/
list_ins_next
int list_ins_next(List *list, ListElmt *element, const void *data);
/*
在参数list指定的链表中element元素后面插入一个新的元素
如果element为NULL,则新元素插入链表的头部
新元素包含一个指向data的指针
插入元素成功,则返回0,否则返回-1
*/
list_rem_next
int list_rem_next(List *list, ListElmt *element, void **data);
/*
移除由参数list指定的链表中的element后面的元素
如果参数element为NULL,则移除链表的表头元素
调用返回后,data执行已经移除的元素中存储的数据
如果移除元素成功,则返回0,否则返回-1
*/
list_size
int list_size(const List *list);
/*
返回参数list指定的链表中的元素的个数
*/
list_head
ListElmt *list_head(const List *list);
/*
返回由参数list指定的链表中的头元素的指针
*/
list_tail
ListElmt *list_tail(const List *list);
/*
返回由参数list指定的链表中尾元素的指针
*/
list_is_head
int list_is_head(const ListElmt *element);
/*
判断由参数element指定的元素是否是链表的头元素
若是,返回1,否则返回-1
*/
list_is_tail
int list_is_tail(const ListElmt *element);
/*
判断由参数element指定的元素是否是链表的尾元素
若是,返回1,否则返回-1
*/
list_data
void *list_data(const ListElmt *element);
/*
返回由参数element所指定的链表元素中保存的数据
*/
list_next
ListElmt *list_next(const ListElmt *element);
/*
返回链表中由参数element所指定的结点的下一个结点元素
*/
实现
头文件的实现:
/* list.h */
#ifndef LIST_H
#define LIST_H
#include <stdlib.h>
/* define a structure for linked list elements */
typedef struct ListElmt_
{
void *data;
struct ListElmt_ *next;
}ListElmt;
/* define a structure for linked lists */
typedef struct List_
{
int size;
int (*match)(const void *key1, const void *key2);
void (*destroy)(void *data);
ListElmt *head;
ListElmt *tail;
}List;
/* public interface */
void list_init(List *list, void (*destroy)(void *data));
void list_destroy(List *list);
int list_ins_next(List *list, ListElmt *element, const void *data);
int list_rem_next(List *list, ListElmt *element, void **data);
#define list_size(list) ((list)->size)
#define list_head(list) ((list)->head)
#define list_tail(list) ((list)->tail)
#define list_is_head(list, element) ((element) == (list)->head ? 1 : 0)
#define list_is_tail(element) ((element)->next == NULL ? 1 : 0)
#define list_data(element) ((element)->data)
#define list_next(element) ((element)->next)
#endif
函数实现:
/* list.c */
#include <stdlib.h>
#include <string.h>
#include "list.h"