CircleLinkList.h
創(chuàng)新互聯(lián)是專業(yè)的新源網(wǎng)站建設(shè)公司,新源接單;提供成都做網(wǎng)站、成都網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行新源網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
#ifndef CIRCLE_LINK_LIST #define CIRCLE_LINK_LIST //鏈表節(jié)點(diǎn) typedef struct _CircleLinkListNode { struct _CircleLinkListNode *next; }CircleLinkListNode; //循環(huán)單鏈表 typedef void CircleLinkList; /* * 創(chuàng)建循環(huán)單鏈表 * @return 返回循環(huán)單鏈表的指針 */ CircleLinkList* CircleLinkList_Create(); /* * 銷毀循環(huán)單鏈表 * @param list 循環(huán)單鏈表的指針 */ void CircleLinkList_Destroy(CircleLinkList *list); /* * 清空循環(huán)單鏈表 * @param list 循環(huán)單鏈表的指針 */ void CircleLinkList_Clear(CircleLinkList *list); /* * 向循環(huán)單鏈表pos位置處插入元素 * @param list 循環(huán)單鏈表指針 * @param node 元素指針 * @param pos 插入的索引 */ int CircleLinkList_Insert(CircleLinkList *list,CircleLinkListNode *node,int pos); /* * 獲取循環(huán)單鏈表中索引位置處的元素 * @param list 循環(huán)單鏈表指針 * @param pos 循環(huán)單鏈表索引值 * @param return 元素指針 */ CircleLinkListNode* CircleLinkList_Get(CircleLinkList *list,int pos); /* * 刪除循環(huán)單鏈表中索引位置處的值 * @param list 循環(huán)單鏈表的指針 * @param pos 循環(huán)單鏈表索引 * @param return 非0表示刪除成功 */ int CircleLinkList_Remove(CircleLinkList *list,int pos); /* * 獲取循環(huán)單鏈表當(dāng)前已存儲(chǔ)元素的個(gè)數(shù) * @param list 循環(huán)單鏈表的指針 * @return 循環(huán)單鏈表中已存儲(chǔ)元素的個(gè)數(shù) */ int CircleLinkList_Length(CircleLinkList *list); /* * 刪除循環(huán)單鏈表中的特定元素 * @param list 循環(huán)單鏈表的指針 * @param pos 循環(huán)單鏈表元素指針 * @param return 非0表示刪除成功 */ int CircleLinkList_DeleteNode(CircleLinkList* list, CircleLinkListNode* node); /* * 重置循環(huán)單鏈表中的游標(biāo),指向表頭 * @param list 循環(huán)單鏈表的指針 * @return 返回游標(biāo)指向的元素的指針 */ CircleLinkListNode* CircleLinkList_Reset(CircleLinkList* list); /* * 獲取當(dāng)前游標(biāo)指向的元素指針 * @param list 循環(huán)單鏈表的指針 * @return 返回當(dāng)前游標(biāo)指向的元素指針 */ CircleLinkListNode* CircleLinkList_Current(CircleLinkList* list); /* * 移動(dòng)當(dāng)前游標(biāo)到下一個(gè)元素 * @param list 循環(huán)單鏈表的指針 * @return 移動(dòng)后的游標(biāo)指向的元素的指針 */ CircleLinkListNode* CircleLinkList_Next(CircleLinkList* list); #endif // CIRCLECircleLinkList
CircleLinkList.c
#include "Circlelinklist.h" #include <malloc.h> //循環(huán)單鏈表 typedef struct _CircleLinkList { CircleLinkListNode header;//鏈表頭節(jié)點(diǎn) CircleLinkListNode* cursor;//游標(biāo) int length;//鏈表長(zhǎng)度 }TCircleLinkList; /* * 創(chuàng)建循環(huán)單鏈表 * @return 返回循環(huán)單鏈表的指針 */ CircleLinkList* CircleLinkList_Create() { TCircleLinkList *list = (TCircleLinkList *)malloc(sizeof(TCircleLinkList)); if(list != 0) { list->header.next = 0; list->length= 0; } return list; } /* * 銷毀循環(huán)單鏈表 * @param list 循環(huán)單鏈表的指針 */ void CircleLinkList_Destroy(CircleLinkList *list) { free(list); } /* * 清空循環(huán)單鏈表 * @param list 循環(huán)單鏈表的指針 */ void CircleLinkList_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; } } /* * 向循環(huán)單鏈表pos位置處插入元素 * @param list 循環(huán)單鏈表指針 * @param node 元素指針 * @param pos 插入的索引 */ int CircleLinkList_Insert(CircleLinkList *list,CircleLinkListNode *node,int pos) { //類型轉(zhuǎn)換 TCircleLinkList* l_list = (TCircleLinkList *)list; //判斷鏈表指針和節(jié)點(diǎn)指針不能為空,當(dāng)前插入的位置是否合法 int ret = ((list != 0) && (node != 0) && (pos >= 0) && (pos <= l_list->length)); if(ret) { CircleLinkListNode* current = (CircleLinkListNode *)l_list; int i; //移動(dòng)到需要插入的位置的前驅(qū) for(i = 0; i < pos;i++) { current = current->next; } node->next = current->next; //被插入節(jié)點(diǎn)的后繼指針指向前驅(qū)節(jié)點(diǎn)的后繼指針 current->next = node; //前驅(qū)節(jié)點(diǎn)的后繼指針指向被插入節(jié)點(diǎn) //如果插入的位置是0,則需要修改尾節(jié)點(diǎn)的后繼指針 if(pos == 0) { current = l_list->header.next; for(i = 0;i < l_list->length;i++) { current = current->next; } current->next = node;//改變尾節(jié)點(diǎn)的指針 //判斷插入是否是空表 if(l_list->length == 0) { l_list->cursor = node; node->next = node; } } l_list->length++; } return ret; } /* * 獲取循環(huán)單鏈表中索引位置處的元素 * @param list 循環(huán)單鏈表指針 * @param pos 循環(huán)單鏈表索引值 * @param return 元素指針 */ CircleLinkListNode* CircleLinkList_Get(CircleLinkList *list,int pos) { CircleLinkListNode* node = 0; TCircleLinkList * l_list = (TCircleLinkList *)list; //判斷鏈表指針不為空,且獲取的索引合法 if( (l_list != 0) && (pos >= 0)) { CircleLinkListNode* current = (CircleLinkListNode *)l_list; int i; for(i = 0; i < pos; i++) { current = current->next; } node = current->next; } return node; } /* * 刪除循環(huán)單鏈表中索引位置處的值 * @param list 循環(huán)單鏈表的指針 * @param pos 循環(huán)單鏈表索引 * @param return 非0表示刪除成功 */ int CircleLinkList_Remove(CircleLinkList *list,int pos) { TCircleLinkList * l_list = (TCircleLinkList *)list; int ret = ((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; int i; 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; } } return ret; } /* * 獲取循環(huán)單鏈表當(dāng)前已存儲(chǔ)元素的個(gè)數(shù) * @param list 循環(huán)單鏈表的指針 * @return 循環(huán)單鏈表中已存儲(chǔ)元素的個(gè)數(shù) */ int CircleLinkList_Length(CircleLinkList *list) { int ret = -1; if(list != 0) { TCircleLinkList * l_list = (TCircleLinkList *)list; ret = l_list->length; } return ret; } /* * 刪除循環(huán)單鏈表中的特定元素 * @param list 循環(huán)單鏈表的指針 * @param pos 循環(huán)單鏈表元素指針 * @param return 被刪除元素的索引 */ int CircleLinkList_DeleteNode(CircleLinkList* list, CircleLinkListNode* node) { int ret = -1; if((list != 0) && (node != 0)) { TCircleLinkList * l_list = (TCircleLinkList *)list; CircleLinkListNode* current = l_list->header.next; int i; for(i = 0; i < l_list->length ;i++) { if(node == current) { CircleLinkList_Remove(l_list,i); ret = i; break; } current = current->next; } } return ret; } /* * 重置循環(huán)單鏈表中的游標(biāo),指向表頭 * @param list 循環(huán)單鏈表的指針 * @return 返回游標(biāo)指向的元素的指針 */ 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; } return node; } /* * 獲取當(dāng)前游標(biāo)指向的元素指針 * @param list 循環(huán)單鏈表的指針 * @return 返回當(dāng)前游標(biāo)指向的元素指針 */ CircleLinkListNode* CircleLinkList_Current(CircleLinkList* list) { CircleLinkListNode *node = 0; if(list != 0) { TCircleLinkList * l_list = (TCircleLinkList *)list; node = l_list->cursor; } return node; } /* * 移動(dòng)當(dāng)前游標(biāo)到下一個(gè)元素 * @param list 循環(huán)單鏈表的指針 * @return 移動(dòng)后的游標(biāo)指向的元素的指針 */ 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; } return node; }
測(cè)試代碼
#include <stdio.h> #include "Circlelinklist.h" struct Value { CircleLinkListNode node; int val; }; int main(void) { struct Value val[5]; int i; struct Value *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); return 0; }
本文名稱:【C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)】循環(huán)單鏈表
文章地址:http://muchs.cn/article28/piphjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、企業(yè)建站、軟件開(kāi)發(fā)、用戶體驗(yàn)、微信小程序、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)