【C语言数据结构】静态单链表

StaticLinkLinst.h
#ifndefSTATIC_LINKLIST_H#defineSTATIC_LINKLIST_HtypedefvoidStaticLinkListNode;//静态单链表节点typedefvoidStaticLinkList;//静态单链表/**创建静态单链表*@paramcapacity静态单链表的最大容量*@return返回静态单链表的指针*/StaticLinkList*StaticLinkList_Create(intcapacity);/**销毁静态单链表*@paramlist静态单链表的指针*/voidStaticLinkList_Destroy(StaticLinkList*list);/**清空静态单链表*@paramlist静态单链表的指针*/voidStaticLinkList_Clear(StaticLinkList*list);/**向静态单链表pos位置处插入元素*@paramlist静态单链表指针*@paramnode元素指针*@parampos插入的索引*/intStaticLinkList_Insert(StaticLinkList*list,StaticLinkListNode*node,intpos);/**获取静态单链表中索引位置处的元素*@paramlist静态单链表指针*@parampos静态单链表索引值*@paramreturn元素指针*/StaticLinkListNode*StaticLinkList_Get(StaticLinkList*list,intpos);/**删除静态单链表中索引位置处的值*@paramlist静态单链表的指针*@parampos静态单链表索引*@paramreturn非0表示删除成功*/intStaticLinkList_Remove(StaticLinkList*list,intpos);/**获取静态单链表当前已存储元素的个数*@paramlist静态单链表的指针*@return静态单链表中已存储元素的个数*/intStaticLinkList_Length(StaticLinkList*list);/**获取静态单链表最大可存储元素的个数*@paramlist静态单链表的指针*@return静态单链表最大可存储元素的个数*/intStaticLinkList_Capacity(StaticLinkList*list);#endif//STATICLINKLIST_HStaticLinkList.c
#include"StaticLinkList.h"#include"malloc.h"#defineNO_NODE-1typedefstruct_StaticLinkListNode{unsignedintdata;//数据域指针intnext;//下一个节点的数组下标}TStaticLinkListNode;typedefstruct_StaticLinkList{intlength;intcapacity;TStaticLinkListNodenode[];//用于存储静态链表的柔性数组}TStaticLinkList;/**创建静态单链表*@paramcapacity静态单链表的最大容量*@return返回静态单链表的指针*/StaticLinkList*StaticLinkList_Create(intcapacity){//由于柔性数组的0位置会被作为头节点,所以实际上容量是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;}/**销毁静态单链表*@paramlist静态单链表的指针*/voidStaticLinkList_Destroy(StaticLinkList*list){free(list);}/**清空静态单链表*@paramlist静态单链表的指针*/voidStaticLinkList_Clear(StaticLinkList*list){if(list!=0){TStaticLinkList*s_list=(TStaticLinkList*)list;s_list->length=0;}}/**向静态单链表pos位置处插入元素*@paramlist静态单链表指针*@paramnode元素指针*@parampos插入的索引*@paramreturn非0表示插入成功*/intStaticLinkList_Insert(StaticLinkList*list,StaticLinkListNode*node,intpos){TStaticLinkList*s_list=(TStaticLinkList*)list;//判断链表和节点指针不为空,位置合法,增加后容量不会大于最大容量intret=((s_list!=0)&&(node!=0)&&(pos>=0)&&\(pos<=s_list->length)&&(s_list->length+1<=s_list->capacity+1));if(ret){intindex=-1;//待放入元素的数组下标intcurrent=0;//当前节点的数组下标inti=0;//遍历查找数组中的空余项for(i=1;i<=s_list->capacity;i++){if(s_list->node[i].next==NO_NODE){index=i;break;}}//移动到需要插入位置的前驱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;}/**获取静态单链表中索引位置处的元素*@paramlist静态单链表指针*@parampos静态单链表索引值*@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;//移动到需要查询的位置for(i=0;i<pos;i++){current=s_list->node[current].next;}//获取元素的数组下标index=s_list->node[current].next;//将data中的类型强制转换成StaticLinkListNode*,因为插入时保存的就是节点的指针s_node=(StaticLinkListNode*)s_list->node[index].data;}returns_node;}/**删除静态单链表中索引位置处的值*@paramlist静态单链表的指针*@parampos静态单链表索引*@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;}//被删除元素的数组下标index=s_list->node[current].next;//将被删元素的后继下标赋值给除被删除元素前驱的后继下标s_list->node[current].next=s_list->node[index].next;//设置被删除元素的后继下标为NO_NODEs_list->node[index].next=NO_NODE;s_list->length--;}returnret;}/**获取静态单链表当前已存储元素的个数*@paramlist静态单链表的指针*@return静态单链表中已存储元素的个数*/intStaticLinkList_Length(StaticLinkList*list){intret=-1;if(list!=0){TStaticLinkList*s_list=(TStaticLinkList*)list;ret=s_list->length;}returnret;}/**获取静态单链表最大可存储元素的个数*@paramlist静态单链表的指针*@return静态单链表最大可存储元素的个数*/intStaticLinkList_Capacity(StaticLinkList*list){intret=-1;if(list!=0){TStaticLinkList*s_list=(TStaticLinkList*)list;ret=s_list->capacity;}returnret;}测试代码
#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;}
了解更多网络知识关注:http://www.vecloud.com/