「算法精解_C语言描述」链表_循环链表的实现与分析
来源:互联网 发布:哪里有淘宝主播招聘 编辑:程序博客网 时间:2024/06/05 15:55
同单链表相似,循环链表中的每个元素也包含两个部分:一个数据域指针和一个指向后继元素的next指针。
数据结构CListElmt代表循环链表中的单独元素。该结构体拥有两个成员,如上面所述。
数据结构CList代表循环链表。这个结构体同单链表相似,但它不包含tail成员。
示例1:循环链表抽象数据类型的头文件
/*CList.h*/#ifndef CLIST_H#define CLIST_H#include <stdio.h>/*定义循环链表中元素的数据结构*/typedef struct CListElmt_{ void *data; struct CListElmt_ *next;} CListElmt;/*定义循环链表的数据结构*/typedef struct CList_{ int size; int (*match)(const void *key1,const void *key2); void (*destroy)(void *data); CListElmt *head;} CList;/*Public Interface*/void clist_init(CList *list,void (*destroy)(void *data));void clist_destroy(Clist *list);int clist_ins_next(CList *list,CListElmt *element,const void *data);int clist_rem_next(CList *list,CListElmt *element,void **data);#define clist_size(list)((list)->size)#define clist_head(list)((list)->head)#define clist_data(element)((element)->data)#define clist_next(element)((element)->next)#endif // CLIST_H
接口定义的相关描述,请参阅循环链表接口定义
示例2:循环链表抽象数据类型的实现
/*clist.c*/#include <stdio.h>#include <string.h>#include "clist.h"/*clist_init 初始化循环链表*/void clist_init(Clist *list,void (*destroy)(void *data)){ list->size = 0; list->destroy = destroy; list->head = NULL; return ;}/*clist_destroy 销毁循环链表*/void clist_destroy(CList *list){ void *data; /*移除所有元素*/ while(clist_size(list)>0) { if(clist_rem_next(clist,element,void **data) == 0 && list->destroy != NULL) { /*调用自定义函数释放动态分配的数据空间*/ list->destroy(data); } } /*链表不允许再有任何操作,清空链表结构*/ memset(list,0,sizeof(CList)); return ;}/*clist_ins_next 向循环链表中插入元素*/int clist_ins_next(CList *list,CListElmt *element,const void *data){ CListElmt *new_element; /*为新元素分配空间*/ if((new_element=(CListElmt *)malloc(sizeof(CListElmt)))==NULL) return -1; /*向链表中插入元素*/ new_element->data = (void *)data; if(clist_size(list)==0) { /*当链表为空时的插入操作*/ new_element->next = new_element; /*元素的next指针指向元素本身*/ list->head = new_element; /*链表头指针指向插入元素*/ } else { /*链表非空时的插入操作*/ new_element->next = element->next; element->next =new_element; } /*变更链表的元素数量*/ list->size++; return 0;}/*clist_rem_next 移除链表中的元素*/int clist_rem_next(CList *list,CListElmt *element,void **data){ CListElmt *old_element; /*空链表不允许有移除操作*/ if(clist_size(list)==0) return -1; /*从链表中移除元素*/ *data = element->next->data; if(element->next == element) /*链表中只有一个元素*/ { /*移除最后一个元素的操作*/ old_element = element->next; list->head = NULL; } else { /*移除非最后一个元素的操作*/ old_element=element->next; element->next=element->next->next; if(old_element == clist_head(list)) /*被移除元素位于头部*/ list->head = old_element->next; } /*释放空间*/ free(old_element); /*变更链表中元素的数量*/ list->size--; return 0;}
阅读全文
0 0
- 「算法精解_C语言描述」链表_循环链表的实现与分析
- 「算法精解_C语言描述」 链表_双向链表的实现与分析
- 「算法精解_C语言描述」栈_栈的实现与分析
- 「算法精解_C语言描述」链表_循环链表介绍
- 「算法精解_C语言描述」链表_关于链表特点的几个问与答
- 「算法精解_C语言描述」链表_循环链表实例 内存页帧置换(图解+实现)
- 「算法精解_C语言描述」 链表_双向链表(接口定义)
- 「算法精解_C语言描述」栈_栈的接口定义
- 算法精解_C语言描述 算法性能分析,如何评判算法!
- (数据结构与算法分析 四)------数组循环队列的实现( Java语言描述)
- 算法精解_C语言 链表_单链表(接口定义+类型实现)
- LZW编解码算法实现与分析_C语言实现
- 数据结构与算法分析 C语言描述 单链表的实现
- <数据结构与算法>双向循环链表的全面基本框架(C语言描述)
- 黑马程序员_C语言冒泡算法和约瑟夫循环分析
- 算法精解_C语言 链表_单链表(应用:页帧管理)
- (数据结构与算法分析 三)------栈的实现(包括链栈和数组实现栈 Java语言描述)
- 数据结构_树_二叉树的建立、遍历、复制与移除_二叉链表存储_C++实现
- 有人的地方就有江湖,有江湖就有恩怨,人就是恩怨,程序员也是人
- ReactiveCocoa入门教程
- 《Effective Go》--defer
- CAP原理和数据高可用性
- Xcode9学习笔记49
- 「算法精解_C语言描述」链表_循环链表的实现与分析
- hadoop2.7.3在centos7上部署安装(单机版)
- 27. Remove Element
- Xcode9学习笔记50
- Android五大布局介绍&属性设置大全
- 传统线程的创建
- Banner轮播图的使用1.4.9
- 《七点三刻》有价值的新闻早餐 2017年11月11日星期六,第002期
- tensorflow中遇到的问题汇总