链表的C语言实现

本文介绍了链表的C语言实现,包括单向链表和双向链表的操作,如初始化、销毁、插入、删除、获取大小、判断头尾等。链表在执行插入和删除操作时比数组更高效,且其存储空间在程序运行时动态分配。
摘要由CSDN通过智能技术生成

链表

链表由一组元素,以一种特定的顺序组合或者链接在一起

相对数组,链表在执行插入、删除操作时具有更高的效率

链表需要动态的开辟存储空间,也就是存储空间在程序运行时是动态分配的

链表类型:单向链表、双向链表、循环链表

单向链表

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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值