单链表由各个元素之间通过一个指针彼此连结起来而组成。链表的每个结点包含两个元素:数据成员和一个指向下一个结点的next指针。通过next指针将结点链接起来形成一个链。最后一个元素的next指针设置为NULL,表示链表的尾端。要访问链表中某个元素,需要从链表头开始访问,通过next依次进行访问,最终找到要寻找的元素。单链表只能从头到尾进行遍历。
链表中得每个结点都是动态分配的(在C语言中使用malloc函数),这些结点的位置都是离散的分布在内存中,所以在维护各个结点之间的信息时候要特别小心,防止丢失链接信息,造成无法访问信息和内存泄露。链表结构如图:
结点结构:
1 | /* define a structed for linked list elements.*/ |
链表结构:
1 | typedef struct forward_list{ |
接口函数为:
1 | void list_init(forward_list *List,void (*destroy)(void *data)); |
功能:初始化由参数list指定的链表,并指定对应的内存释放函数
时间复杂度 : O(1)
1 | void list_destroy(forward_list *list); |
功能:销毁由参数list指定的链表,由指定的destroy函数释放内存
时间复杂度: O(n),
1 | int list_insert(forward_list *list,ListElm *elem,const void* data); |
返回值:如果插入元素成功则返回0,否则返回-1
时间复杂度 : O(1)
功能:向参数list指定的链表中的elem结点后插入一个新的元素,新结点中元素的值是data
1 | int list_remove(forward_list *list,ListElm* elem,void** data); |
返回值:如果删除元素成功则返回0,否则返回-1,
时间复杂度: O(1)
功能:删除参数list指定的链表中的elem后的一个结点,并将移除结点的数据储存到data中
1 | int list_size(const forward_list* list) |
返回值:返回指定链表的结点个数
时间复杂度 : O(1)
1 | ListElm* getHead(forward_list const*list) |
返回值:返回指定链表的头结点
时间复杂度 : O(1)
1 | ListElm* getTail(forward_list const*list) |
返回值:返回指定链表的尾结点
时间复杂度 : O(1)
1 | bool isHead(const forward_list * list,const ListElm *Node) |
返回值:若Node是list链表头结点返回true,负责返回false
时间复杂度 : O(1)
1 | bool IsTail(const forward_list * list,const ListElm *Node) |
返回值:若Node是list链表尾结点返回true,负责返回false
时间复杂度 : O(1)
1 | void* list_data(const ListElm *Node) |
返回值: 结点中保存的数据data
时间复杂度 : O(1)
1 | ListElm* list_next(const ListElm* Node) |
返回值:指定结点的下一个结点
时间复杂度 : O(1)
代码实现:
forward_list.h
1 | // |
forward_list.c
1 | // |
main.c
1 |
|