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

StaticLinkLinst.h?
#ifndefSTATIC_LINKLIST_H#defineSTATIC_LINKLIST_HtypedefvoidStaticLinkListNode;//靜態(tài)單鏈表節(jié)點(diǎn)typedefvoidStaticLinkList;//靜態(tài)單鏈表/**創(chuàng)建靜態(tài)單鏈表*@paramcapacity靜態(tài)單鏈表的最大容量*@return返回靜態(tài)單鏈表的指針*/StaticLinkList*StaticLinkList_Create(intcapacity);/**銷(xiāo)毀靜態(tài)單鏈表*@paramlist靜態(tài)單鏈表的指針*/voidStaticLinkList_Destroy(StaticLinkList*list);/**清空靜態(tài)單鏈表*@paramlist靜態(tài)單鏈表的指針*/voidStaticLinkList_Clear(StaticLinkList*list);/**向靜態(tài)單鏈表pos位置處插入元素*@paramlist靜態(tài)單鏈表指針*@paramnode元素指針*@parampos插入的索引*/intStaticLinkList_Insert(StaticLinkList*list,StaticLinkListNode*node,intpos);/**獲取靜態(tài)單鏈表中索引位置處的元素*@paramlist靜態(tài)單鏈表指針*@parampos靜態(tài)單鏈表索引值*@paramreturn元素指針*/StaticLinkListNode*StaticLinkList_Get(StaticLinkList*list,intpos);/**刪除靜態(tài)單鏈表中索引位置處的值*@paramlist靜態(tài)單鏈表的指針*@parampos靜態(tài)單鏈表索引*@paramreturn非0表示刪除成功*/intStaticLinkList_Remove(StaticLinkList*list,intpos);/**獲取靜態(tài)單鏈表當(dāng)前已存儲(chǔ)元素的個(gè)數(shù)*@paramlist靜態(tài)單鏈表的指針*@return靜態(tài)單鏈表中已存儲(chǔ)元素的個(gè)數(shù)*/intStaticLinkList_Length(StaticLinkList*list);/**獲取靜態(tài)單鏈表最大可存儲(chǔ)元素的個(gè)數(shù)*@paramlist靜態(tài)單鏈表的指針*@return靜態(tài)單鏈表最大可存儲(chǔ)元素的個(gè)數(shù)*/intStaticLinkList_Capacity(StaticLinkList*list);#endif//STATICLINKLIST_HStaticLinkList.c?
#include"StaticLinkList.h"#include"malloc.h"#defineNO_NODE-1typedefstruct_StaticLinkListNode{unsignedintdata;//數(shù)據(jù)域指針intnext;//下一個(gè)節(jié)點(diǎn)的數(shù)組下標(biāo)}TStaticLinkListNode;typedefstruct_StaticLinkList{intlength;intcapacity;TStaticLinkListNodenode[];//用于存儲(chǔ)靜態(tài)鏈表的柔性數(shù)組}TStaticLinkList;/**創(chuàng)建靜態(tài)單鏈表*@paramcapacity靜態(tài)單鏈表的最大容量*@return返回靜態(tài)單鏈表的指針*/StaticLinkList*StaticLinkList_Create(intcapacity){//由于柔性數(shù)組的0位置會(huì)被作為頭節(jié)點(diǎn),所以實(shí)際上容量是capapcity+1size_tsize=sizeof(TStaticLinkList)+sizeof(TStaticLinkListNode)*(capacity+1);TStaticLinkList*list=(TStaticLinkList*)malloc(size);if(list!=0){inti;list->capacity=capacity;list->length=0;list->node[0].next=0;for(i=1;i<=capacity;i++){list->node[i].next=NO_NODE;}}returnlist;}/**銷(xiāo)毀靜態(tài)單鏈表*@paramlist靜態(tài)單鏈表的指針*/voidStaticLinkList_Destroy(StaticLinkList*list){free(list);}/**清空靜態(tài)單鏈表*@paramlist靜態(tài)單鏈表的指針*/voidStaticLinkList_Clear(StaticLinkList*list){if(list!=0){TStaticLinkList*s_list=(TStaticLinkList*)list;s_list->length=0;}}/**向靜態(tài)單鏈表pos位置處插入元素*@paramlist靜態(tài)單鏈表指針*@paramnode元素指針*@parampos插入的索引*@paramreturn非0表示插入成功*/intStaticLinkList_Insert(StaticLinkList*list,StaticLinkListNode*node,intpos){TStaticLinkList*s_list=(TStaticLinkList*)list;//判斷鏈表和節(jié)點(diǎn)指針不為空,位置合法,增加后容量不會(huì)大于最大容量intret=((s_list!=0)&&(node!=0)&&(pos>=0)&&\(pos<=s_list->length)&&(s_list->length+1<=s_list->capacity+1));if(ret){intindex=-1;//待放入元素的數(shù)組下標(biāo)intcurrent=0;//當(dāng)前節(jié)點(diǎn)的數(shù)組下標(biāo)inti=0;//遍歷查找數(shù)組中的空余項(xiàng)for(i=1;i<=s_list->capacity;i++){if(s_list->node[i].next==NO_NODE){index=i;break;}}//移動(dòng)到需要插入位置的前驅(qū)for(i=0;i<pos;i++){current=s_list->node[current].next;}s_list->node[index].next=s_list->node[current].next;s_list->node[index].data=(unsignedint)node;s_list->node[current].next=index;s_list->length++;}returnret;}/**獲取靜態(tài)單鏈表中索引位置處的元素*@paramlist靜態(tài)單鏈表指針*@parampos靜態(tài)單鏈表索引值*@paramreturn元素指針*/StaticLinkListNode*StaticLinkList_Get(StaticLinkList*list,intpos){TStaticLinkListNode*s_node=0;TStaticLinkList*s_list=(TStaticLinkList*)list;if((list!=0)&&(pos>=0)&&(pos<s_list->length)){intcurrent=0;intindex=-1;inti;//移動(dòng)到需要查詢的位置for(i=0;i<pos;i++){current=s_list->node[current].next;}//獲取元素的數(shù)組下標(biāo)index=s_list->node[current].next;//將data中的類(lèi)型強(qiáng)制轉(zhuǎn)換成StaticLinkListNode*,因?yàn)椴迦霑r(shí)保存的就是節(jié)點(diǎn)的指針s_node=(StaticLinkListNode*)s_list->node[index].data;}returns_node;}/**刪除靜態(tài)單鏈表中索引位置處的值*@paramlist靜態(tài)單鏈表的指針*@parampos靜態(tài)單鏈表索引*@paramreturn非0表示刪除成功*/intStaticLinkList_Remove(StaticLinkList*list,intpos){TStaticLinkList*s_list=(TStaticLinkList*)list;intret=((s_list!=0)&&(pos>=0)&&(pos<s_list->length));if(ret){intindex=-1;intcurrent=0;inti=0;for(i=0;i<pos;i++){current=s_list->node[current].next;}//被刪除元素的數(shù)組下標(biāo)index=s_list->node[current].next;//將被刪元素的后繼下標(biāo)賦值給除被刪除元素前驅(qū)的后繼下標(biāo)s_list->node[current].next=s_list->node[index].next;//設(shè)置被刪除元素的后繼下標(biāo)為NO_NODEs_list->node[index].next=NO_NODE;s_list->length--;}returnret;}/**獲取靜態(tài)單鏈表當(dāng)前已存儲(chǔ)元素的個(gè)數(shù)*@paramlist靜態(tài)單鏈表的指針*@return靜態(tài)單鏈表中已存儲(chǔ)元素的個(gè)數(shù)*/intStaticLinkList_Length(StaticLinkList*list){intret=-1;if(list!=0){TStaticLinkList*s_list=(TStaticLinkList*)list;ret=s_list->length;}returnret;}/**獲取靜態(tài)單鏈表最大可存儲(chǔ)元素的個(gè)數(shù)*@paramlist靜態(tài)單鏈表的指針*@return靜態(tài)單鏈表最大可存儲(chǔ)元素的個(gè)數(shù)*/intStaticLinkList_Capacity(StaticLinkList*list){intret=-1;if(list!=0){TStaticLinkList*s_list=(TStaticLinkList*)list;ret=s_list->capacity;}returnret;}測(cè)試代碼?
#include<stdio.h>#include"StaticLinkList.h"intmain(void){inti,*j;inta[5];StaticLinkList*list=StaticLinkList_Create(5);for(i=0;i<5;i++){a[i]=i;}for(i=0;i<5;i++){StaticLinkList_Insert(list,&(a[i]),0);}StaticLinkList_Remove(list,0);for(i=0;i<StaticLinkList_Length(list);i++){j=StaticLinkList_Get(list,i);printf("%d\n",*j);}return0;}
了解更多網(wǎng)絡(luò)知識(shí)關(guān)注:http://www.vecloud.com/