【C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)】單鏈表

LinkList.h?
#ifndefLINK_LIST_H#defineLINK_LIST_H//鏈表節(jié)點(diǎn)typedefstruct_LinkListNode{struct_LinkListNode*next;}LinkListNode;//單鏈表typedefvoidLinkList;/**創(chuàng)建單鏈表*@return返回單鏈表的指針*/LinkList*LinkList_Create();/**銷毀單鏈表*@paramlist單鏈表的指針*/voidLinkList_Destroy(LinkList*list);/**清空單鏈表*@paramlist單鏈表的指針*/voidLinkList_Clear(LinkList*list);/**向單鏈表pos位置處插入元素*@paramlist單鏈表指針*@paramnode元素指針*@parampos插入的索引*/intLinkList_Insert(LinkList*list,LinkListNode*node,intpos);/**獲取單鏈表中索引位置處的元素*@paramlist單鏈表指針*@parampos單鏈表索引值*@paramreturn元素指針*/LinkListNode*LinkList_Get(LinkList*list,intpos);/**刪除單鏈表中索引位置處的值*@paramlist單鏈表的指針*@parampos單鏈表索引*@paramreturn非0表示刪除成功*/intLinkList_Remove(LinkList*list,intpos);/**獲取單鏈表當(dāng)前已存儲(chǔ)元素的個(gè)數(shù)*@paramlist單鏈表的指針*@return單鏈表中已存儲(chǔ)元素的個(gè)數(shù)*/intLinkList_Length(LinkList*list);#endif//LINKLIST_HLinkLink.c?
#include"Linklist.h"#include<malloc.h>//單鏈表typedefstruct_LinkList{LinkListNodeheader;//鏈表頭節(jié)點(diǎn)intlength;//鏈表長(zhǎng)度}TLinkList;/**創(chuàng)建單鏈表*@return返回單鏈表的指針*/LinkList*LinkList_Create(){TLinkList*list=(TLinkList*)malloc(sizeof(LinkList));if(list!=0){list->header.next=0;//初始化頭結(jié)點(diǎn)的后繼指針為空l(shuí)ist->length=0;}returnlist;}/**銷毀單鏈表*@paramlist單鏈表的指針*/voidLinkList_Destroy(LinkList*list){free(list);}/**清空單鏈表*@paramlist單鏈表的指針*/voidLinkList_Clear(LinkList*list){if(list!=0){TLinkList*l_list=(TLinkList*)list;l_list->header.next=0;l_list->length=0;}}/**向單鏈表pos位置處插入元素*@paramlist單鏈表指針*@paramnode元素指針*@parampos插入的索引*/intLinkList_Insert(LinkList*list,LinkListNode*node,intpos){//類型轉(zhuǎn)換TLinkList*l_list=(TLinkList*)list;//判斷鏈表指針和節(jié)點(diǎn)指針不能為空,當(dāng)前插入的位置是否合法intret=((list!=0)&&(node!=0)&&(pos>=0)&&(pos<=l_list->length));if(ret){LinkListNode*current=(LinkList*)l_list;inti;//移動(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)l_list->length++;}returnret;}/**獲取單鏈表中索引位置處的元素*@paramlist單鏈表指針*@parampos單鏈表索引值*@paramreturn元素指針*/LinkListNode*LinkList_Get(LinkList*list,intpos){LinkListNode*node=0;TLinkList*l_list=(TLinkList*)list;//判斷鏈表指針不為空,且獲取的索引合法if((l_list!=0)&&(pos>=0)&&(pos<l_list->length)){LinkListNode*current=(LinkList*)l_list;inti;for(i=0;i<pos;i++){current=current->next;}node=current->next;}returnnode;}/**刪除單鏈表中索引位置處的值*@paramlist單鏈表的指針*@parampos單鏈表索引*@paramreturn非0表示刪除成功*/intLinkList_Remove(LinkList*list,intpos){TLinkList*l_list=(TLinkList*)list;intret=((l_list!=0)&&(pos>=0)&&(pos<l_list->length));if(ret){LinkListNode*current=(LinkList*)l_list;inti;for(i=0;i<pos;i++){current=current->next;}//被刪除元素的前驅(qū)元素的后繼指針,指向被刪除元素的后繼指針current->next=current->next->next;l_list->length--;}returnret;}/**獲取單鏈表當(dāng)前已存儲(chǔ)元素的個(gè)數(shù)*@paramlist單鏈表的指針*@return單鏈表中已存儲(chǔ)元素的個(gè)數(shù)*/intLinkList_Length(LinkList*list){intret=-1;if(list!=0){TLinkList*l_list=(TLinkList*)list;ret=l_list->length;}returnret;}測(cè)試代碼?
#include<stdio.h>#include"Linklist.h"typedefstruct_node{LinkListNodenode;intv;}Node;intmain(void){inti;Noden[5];Node*node;for(i=0;i<5;i++){n[i].v=i;}LinkList*list=LinkList_Create();for(i=0;i<5;i++){LinkList_Insert(list,(LinkListNode*)&(n[i]),0);}LinkList_Remove(list,2);for(i=0;i<LinkList_Length(list);i++){node=(Node*)LinkList_Get(list,i);printf("%d\n",node->v);}return0;}?
了解更多網(wǎng)絡(luò)知識(shí)關(guān)注:http://www.vecloud.com/