【C语言数据结构】循环单链表

CircleLinkList.h
#ifndefCIRCLE_LINK_LIST#defineCIRCLE_LINK_LIST//链表节点typedefstruct_CircleLinkListNode{struct_CircleLinkListNode*next;}CircleLinkListNode;//循环单链表typedefvoidCircleLinkList;/**创建循环单链表*@return返回循环单链表的指针*/CircleLinkList*CircleLinkList_Create();/**销毁循环单链表*@paramlist循环单链表的指针*/voidCircleLinkList_Destroy(CircleLinkList*list);/**清空循环单链表*@paramlist循环单链表的指针*/voidCircleLinkList_Clear(CircleLinkList*list);/**向循环单链表pos位置处插入元素*@paramlist循环单链表指针*@paramnode元素指针*@parampos插入的索引*/intCircleLinkList_Insert(CircleLinkList*list,CircleLinkListNode*node,intpos);/**获取循环单链表中索引位置处的元素*@paramlist循环单链表指针*@parampos循环单链表索引值*@paramreturn元素指针*/CircleLinkListNode*CircleLinkList_Get(CircleLinkList*list,intpos);/**删除循环单链表中索引位置处的值*@paramlist循环单链表的指针*@parampos循环单链表索引*@paramreturn非0表示删除成功*/intCircleLinkList_Remove(CircleLinkList*list,intpos);/**获取循环单链表当前已存储元素的个数*@paramlist循环单链表的指针*@return循环单链表中已存储元素的个数*/intCircleLinkList_Length(CircleLinkList*list);/**删除循环单链表中的特定元素*@paramlist循环单链表的指针*@parampos循环单链表元素指针*@paramreturn非0表示删除成功*/intCircleLinkList_DeleteNode(CircleLinkList*list,CircleLinkListNode*node);/**重置循环单链表中的游标,指向表头*@paramlist循环单链表的指针*@return返回游标指向的元素的指针*/CircleLinkListNode*CircleLinkList_Reset(CircleLinkList*list);/**获取当前游标指向的元素指针*@paramlist循环单链表的指针*@return返回当前游标指向的元素指针*/CircleLinkListNode*CircleLinkList_Current(CircleLinkList*list);/**移动当前游标到下一个元素*@paramlist循环单链表的指针*@return移动后的游标指向的元素的指针*/CircleLinkListNode*CircleLinkList_Next(CircleLinkList*list);#endif//CIRCLECircleLinkListCircleLinkList.c
#include"Circlelinklist.h"#include<malloc.h>//循环单链表typedefstruct_CircleLinkList{CircleLinkListNodeheader;//链表头节点CircleLinkListNode*cursor;//游标intlength;//链表长度}TCircleLinkList;/**创建循环单链表*@return返回循环单链表的指针*/CircleLinkList*CircleLinkList_Create(){TCircleLinkList*list=(TCircleLinkList*)malloc(sizeof(TCircleLinkList));if(list!=0){list->header.next=0;list->length=0;}returnlist;}/**销毁循环单链表*@paramlist循环单链表的指针*/voidCircleLinkList_Destroy(CircleLinkList*list){free(list);}/**清空循环单链表*@paramlist循环单链表的指针*/voidCircleLinkList_Clear(CircleLinkList*list){if(list!=0){TCircleLinkList*c_list=(TCircleLinkList*)c_list;c_list->header.next=0;c_list->length=0;c_list->cursor=0;}}/**向循环单链表pos位置处插入元素*@paramlist循环单链表指针*@paramnode元素指针*@parampos插入的索引*/intCircleLinkList_Insert(CircleLinkList*list,CircleLinkListNode*node,intpos){//类型转换TCircleLinkList*l_list=(TCircleLinkList*)list;//判断链表指针和节点指针不能为空,当前插入的位置是否合法intret=((list!=0)&&(node!=0)&&(pos>=0)&&(pos<=l_list->length));if(ret){CircleLinkListNode*current=(CircleLinkListNode*)l_list;inti;//移动到需要插入的位置的前驱for(i=0;i<pos;i++){current=current->next;}node->next=current->next;//被插入节点的后继指针指向前驱节点的后继指针current->next=node;//前驱节点的后继指针指向被插入节点//如果插入的位置是0,则需要修改尾节点的后继指针if(pos==0){current=l_list->header.next;for(i=0;i<l_list->length;i++){current=current->next;}current->next=node;//改变尾节点的指针//判断插入是否是空表if(l_list->length==0){l_list->cursor=node;node->next=node;}}l_list->length++;}returnret;}/**获取循环单链表中索引位置处的元素*@paramlist循环单链表指针*@parampos循环单链表索引值*@paramreturn元素指针*/CircleLinkListNode*CircleLinkList_Get(CircleLinkList*list,intpos){CircleLinkListNode*node=0;TCircleLinkList*l_list=(TCircleLinkList*)list;//判断链表指针不为空,且获取的索引合法if((l_list!=0)&&(pos>=0)){CircleLinkListNode*current=(CircleLinkListNode*)l_list;inti;for(i=0;i<pos;i++){current=current->next;}node=current->next;}returnnode;}/**删除循环单链表中索引位置处的值*@paramlist循环单链表的指针*@parampos循环单链表索引*@paramreturn非0表示删除成功*/intCircleLinkList_Remove(CircleLinkList*list,intpos){TCircleLinkList*l_list=(TCircleLinkList*)list;intret=((l_list!=0)&&(pos>=0)&&(pos<l_list->length));if(ret){CircleLinkListNode*current=(CircleLinkListNode*)list;CircleLinkListNode*first=l_list->header.next;CircleLinkListNode*last=(CircleLinkListNode*)CircleLinkList_Get(l_list,l_list->length-1);CircleLinkListNode*del;inti;for(i=0;i<pos;i++){current=current->next;}del=current->next;current->next=del->next;l_list->length--;if(first==del){l_list->header.next=del->next;last->next=del->next;}if(l_list->cursor==del){l_list->cursor=del->next;}if(l_list->length==0){l_list->header.next=0;l_list->cursor=0;}}returnret;}/**获取循环单链表当前已存储元素的个数*@paramlist循环单链表的指针*@return循环单链表中已存储元素的个数*/intCircleLinkList_Length(CircleLinkList*list){intret=-1;if(list!=0){TCircleLinkList*l_list=(TCircleLinkList*)list;ret=l_list->length;}returnret;}/**删除循环单链表中的特定元素*@paramlist循环单链表的指针*@parampos循环单链表元素指针*@paramreturn被删除元素的索引*/intCircleLinkList_DeleteNode(CircleLinkList*list,CircleLinkListNode*node){intret=-1;if((list!=0)&&(node!=0)){TCircleLinkList*l_list=(TCircleLinkList*)list;CircleLinkListNode*current=l_list->header.next;inti;for(i=0;i<l_list->length;i++){if(node==current){CircleLinkList_Remove(l_list,i);ret=i;break;}current=current->next;}}returnret;}/**重置循环单链表中的游标,指向表头*@paramlist循环单链表的指针*@return返回游标指向的元素的指针*/CircleLinkListNode*CircleLinkList_Reset(CircleLinkList*list){CircleLinkListNode*node=0;if(list!=0){TCircleLinkList*l_list=(TCircleLinkList*)list;l_list->cursor=l_list->header.next;node=l_list->cursor;}returnnode;}/**获取当前游标指向的元素指针*@paramlist循环单链表的指针*@return返回当前游标指向的元素指针*/CircleLinkListNode*CircleLinkList_Current(CircleLinkList*list){CircleLinkListNode*node=0;if(list!=0){TCircleLinkList*l_list=(TCircleLinkList*)list;node=l_list->cursor;}returnnode;}/**移动当前游标到下一个元素*@paramlist循环单链表的指针*@return移动后的游标指向的元素的指针*/CircleLinkListNode*CircleLinkList_Next(CircleLinkList*list){CircleLinkListNode*node=0;if(list!=0){TCircleLinkList*l_list=(TCircleLinkList*)list;l_list->cursor=l_list->cursor->next;node=l_list->cursor;}returnnode;}测试代码
#include<stdio.h>#include"Circlelinklist.h"structValue{CircleLinkListNodenode;intval;};intmain(void){structValueval[5];inti;structValue*p;CircleLinkList*list=CircleLinkList_Create();for(i=0;i<5;i++){val[i].val=i;}for(i=0;i<5;i++){CircleLinkList_Insert(list,(CircleLinkListNode*)&(val[i]),0);}//CircleLinkList_DeleteNode(list,&(val[0]));for(i=0;i<6;i++){p=CircleLinkList_Get(list,i);printf("%d\n",p->val);CircleLinkList_Next(list);}CircleLinkList_Reset(list);p=CircleLinkList_Get(list,0);printf("%d\n",p->val);return0;}
CircleLinkList.h
#ifndefCIRCLE_LINK_LIST#defineCIRCLE_LINK_LIST//链表节点typedefstruct_CircleLinkListNode{struct_CircleLinkListNode*next;}CircleLinkListNode;//循环单链表typedefvoidCircleLinkList;/**创建循环单链表*@return返回循环单链表的指针*/CircleLinkList*CircleLinkList_Create();/**销毁循环单链表*@paramlist循环单链表的指针*/voidCircleLinkList_Destroy(CircleLinkList*list);/**清空循环单链表*@paramlist循环单链表的指针*/voidCircleLinkList_Clear(CircleLinkList*list);/**向循环单链表pos位置处插入元素*@paramlist循环单链表指针*@paramnode元素指针*@parampos插入的索引*/intCircleLinkList_Insert(CircleLinkList*list,CircleLinkListNode*node,intpos);/**获取循环单链表中索引位置处的元素*@paramlist循环单链表指针*@parampos循环单链表索引值*@paramreturn元素指针*/CircleLinkListNode*CircleLinkList_Get(CircleLinkList*list,intpos);/**删除循环单链表中索引位置处的值*@paramlist循环单链表的指针*@parampos循环单链表索引*@paramreturn非0表示删除成功*/intCircleLinkList_Remove(CircleLinkList*list,intpos);/**获取循环单链表当前已存储元素的个数*@paramlist循环单链表的指针*@return循环单链表中已存储元素的个数*/intCircleLinkList_Length(CircleLinkList*list);/**删除循环单链表中的特定元素*@paramlist循环单链表的指针*@parampos循环单链表元素指针*@paramreturn非0表示删除成功*/intCircleLinkList_DeleteNode(CircleLinkList*list,CircleLinkListNode*node);/**重置循环单链表中的游标,指向表头*@paramlist循环单链表的指针*@return返回游标指向的元素的指针*/CircleLinkListNode*CircleLinkList_Reset(CircleLinkList*list);/**获取当前游标指向的元素指针*@paramlist循环单链表的指针*@return返回当前游标指向的元素指针*/CircleLinkListNode*CircleLinkList_Current(CircleLinkList*list);/**移动当前游标到下一个元素*@paramlist循环单链表的指针*@return移动后的游标指向的元素的指针*/CircleLinkListNode*CircleLinkList_Next(CircleLinkList*list);#endif//CIRCLECircleLinkListCircleLinkList.c
#include"Circlelinklist.h"#include<malloc.h>//循环单链表typedefstruct_CircleLinkList{CircleLinkListNodeheader;//链表头节点CircleLinkListNode*cursor;//游标intlength;//链表长度}TCircleLinkList;/**创建循环单链表*@return返回循环单链表的指针*/CircleLinkList*CircleLinkList_Create(){TCircleLinkList*list=(TCircleLinkList*)malloc(sizeof(TCircleLinkList));if(list!=0){list->header.next=0;list->length=0;}returnlist;}/**销毁循环单链表*@paramlist循环单链表的指针*/voidCircleLinkList_Destroy(CircleLinkList*list){free(list);}/**清空循环单链表*@paramlist循环单链表的指针*/voidCircleLinkList_Clear(CircleLinkList*list){if(list!=0){TCircleLinkList*c_list=(TCircleLinkList*)c_list;c_list->header.next=0;c_list->length=0;c_list->cursor=0;}}/**向循环单链表pos位置处插入元素*@paramlist循环单链表指针*@paramnode元素指针*@parampos插入的索引*/intCircleLinkList_Insert(CircleLinkList*list,CircleLinkListNode*node,intpos){//类型转换TCircleLinkList*l_list=(TCircleLinkList*)list;//判断链表指针和节点指针不能为空,当前插入的位置是否合法intret=((list!=0)&&(node!=0)&&(pos>=0)&&(pos<=l_list->length));if(ret){CircleLinkListNode*current=(CircleLinkListNode*)l_list;inti;//移动到需要插入的位置的前驱for(i=0;i<pos;i++){current=current->next;}node->next=current->next;//被插入节点的后继指针指向前驱节点的后继指针current->next=node;//前驱节点的后继指针指向被插入节点//如果插入的位置是0,则需要修改尾节点的后继指针if(pos==0){current=l_list->header.next;for(i=0;i<l_list->length;i++){current=current->next;}current->next=node;//改变尾节点的指针//判断插入是否是空表if(l_list->length==0){l_list->cursor=node;node->next=node;}}l_list->length++;}returnret;}/**获取循环单链表中索引位置处的元素*@paramlist循环单链表指针*@parampos循环单链表索引值*@paramreturn元素指针*/CircleLinkListNode*CircleLinkList_Get(CircleLinkList*list,intpos){CircleLinkListNode*node=0;TCircleLinkList*l_list=(TCircleLinkList*)list;//判断链表指针不为空,且获取的索引合法if((l_list!=0)&&(pos>=0)){CircleLinkListNode*current=(CircleLinkListNode*)l_list;inti;for(i=0;i<pos;i++){current=current->next;}node=current->next;}returnnode;}/**删除循环单链表中索引位置处的值*@paramlist循环单链表的指针*@parampos循环单链表索引*@paramreturn非0表示删除成功*/intCircleLinkList_Remove(CircleLinkList*list,intpos){TCircleLinkList*l_list=(TCircleLinkList*)list;intret=((l_list!=0)&&(pos>=0)&&(pos<l_list->length));if(ret){CircleLinkListNode*current=(CircleLinkListNode*)list;CircleLinkListNode*first=l_list->header.next;CircleLinkListNode*last=(CircleLinkListNode*)CircleLinkList_Get(l_list,l_list->length-1);CircleLinkListNode*del;inti;for(i=0;i<pos;i++){current=current->next;}del=current->next;current->next=del->next;l_list->length--;if(first==del){l_list->header.next=del->next;last->next=del->next;}if(l_list->cursor==del){l_list->cursor=del->next;}if(l_list->length==0){l_list->header.next=0;l_list->cursor=0;}}returnret;}/**获取循环单链表当前已存储元素的个数*@paramlist循环单链表的指针*@return循环单链表中已存储元素的个数*/intCircleLinkList_Length(CircleLinkList*list){intret=-1;if(list!=0){TCircleLinkList*l_list=(TCircleLinkList*)list;ret=l_list->length;}returnret;}/**删除循环单链表中的特定元素*@paramlist循环单链表的指针*@parampos循环单链表元素指针*@paramreturn被删除元素的索引*/intCircleLinkList_DeleteNode(CircleLinkList*list,CircleLinkListNode*node){intret=-1;if((list!=0)&&(node!=0)){TCircleLinkList*l_list=(TCircleLinkList*)list;CircleLinkListNode*current=l_list->header.next;inti;for(i=0;i<l_list->length;i++){if(node==current){CircleLinkList_Remove(l_list,i);ret=i;break;}current=current->next;}}returnret;}/**重置循环单链表中的游标,指向表头*@paramlist循环单链表的指针*@return返回游标指向的元素的指针*/CircleLinkListNode*CircleLinkList_Reset(CircleLinkList*list){CircleLinkListNode*node=0;if(list!=0){TCircleLinkList*l_list=(TCircleLinkList*)list;l_list->cursor=l_list->header.next;node=l_list->cursor;}returnnode;}/**获取当前游标指向的元素指针*@paramlist循环单链表的指针*@return返回当前游标指向的元素指针*/CircleLinkListNode*CircleLinkList_Current(CircleLinkList*list){CircleLinkListNode*node=0;if(list!=0){TCircleLinkList*l_list=(TCircleLinkList*)list;node=l_list->cursor;}returnnode;}/**移动当前游标到下一个元素*@paramlist循环单链表的指针*@return移动后的游标指向的元素的指针*/CircleLinkListNode*CircleLinkList_Next(CircleLinkList*list){CircleLinkListNode*node=0;if(list!=0){TCircleLinkList*l_list=(TCircleLinkList*)list;l_list->cursor=l_list->cursor->next;node=l_list->cursor;}returnnode;}测试代码
#include<stdio.h>#include"Circlelinklist.h"structValue{CircleLinkListNodenode;intval;};intmain(void){structValueval[5];inti;structValue*p;CircleLinkList*list=CircleLinkList_Create();for(i=0;i<5;i++){val[i].val=i;}for(i=0;i<5;i++){CircleLinkList_Insert(list,(CircleLinkListNode*)&(val[i]),0);}//CircleLinkList_DeleteNode(list,&(val[0]));for(i=0;i<6;i++){p=CircleLinkList_Get(list,i);printf("%d\n",p->val);CircleLinkList_Next(list);}CircleLinkList_Reset(list);p=CircleLinkList_Get(list,0);printf("%d\n",p->val);return0;}
了解更多网络知识关注:http://www.vecloud.com/