静态链表便于在不设指针类型的高级语言使用链表结构,静态链表用数组描述,数组的一个分量表示一个结点,同时用游标(指示器cur)代替指针来表示结点在数组中的相对位置。
/* 2016年10月11日10:47:23 静态链表 */ #include<stdio.h> #define MAXSIZE 100 typedef struct { int data; //数据域 int cur; //游标,为0是表示无指向 }component, SLinkList[MAXSIZE]; //函数声明 void InitSpace_SL(SLinkList space); int Malloc_SL(SLinkList space); void Free_SL(SLinkList space, int k); void ListTraverse_SL(SLinkList space); int Listlength_SL(SLinkList space); bool ListInsert_SL(SLinkList space, int pos, int val); bool ListDelete_SL(SLinkList space, int pos, int *val); int main(void) { int val; SLinkList space; InitSpace_SL(space); /* ListInsert_SL(space, 1, 99); ListInsert_SL(space, 2, 100); ListInsert_SL(space, 3, 101); ListInsert_SL(space, 4, 102); */ ListTraverse_SL(space); ListDelete_SL(space, 2, &val); ListTraverse_SL(space); return 0; } void InitSpace_SL(SLinkList space) //不需要用指针,因为通过改变函数形参数组的值会使实参数组的值改变 { int i; int len; //用来存储结点的个数 int val; //用来存储结点的数值 for(i = 0; i < MAXSIZE-1; ++i) { space[i].cur = i+1; } space[MAXSIZE-1].cur = 0; //目前静态链表为空,最后一个元素cur为0 printf("请输入静态链表结点的个数:\n"); printf("len = "); scanf("%d",&len); for(i = 1; i <= len; ++i) { printf("请输入第%d个结点的值:",i); scanf("%d",&val); space[i].data = val; } space[0].cur = len + 1; //第一个数组元素的cur用来存放备用链表的第一个结点下标 space[len].cur = 0; space[MAXSIZE-1].cur = 1; //最后一个数组元素存放第一个有效结点的下标 return; } int Malloc_SL(SLinkList space) //若备用空间链表非空,则返回分配的结点下标,否则返回0 { int i; i = space[0].cur; //因为数组第一个结点存放的就是第一个备用链表的下标 if(0 != space[0].cur) { space[0].cur = space[i].cur; //更新为备用链表的下一个结点 } return i; } void Free_SL(SLinkList space, int k) //将下标为k的空闲结点回收到备用链表 { space[k].cur = space[0].cur; //使第k个结点指向原本备用链表的首结点 space[0].cur = k; //将第k个结点作为新的备用链表首结点 return; } void ListTraverse_SL(SLinkList space) //遍历输出 { int i = space[MAXSIZE-1].cur; while( 0 != i) { printf("%d\n", space[i].data); i = space[i].cur; } return; } int LocateElem_SL(SLinkList space, int e) //在静态链表L中查找第一个值为e的元素,若找到则返回它在L中的位序,否则返回0 { int i = space[MAXSIZE-1].cur; while( (e != space[i].data) && (0 != i) ) { i = space[i].cur; } return i; } int Listlength_SL(SLinkList space) //返回静态链表space中有效数值的个数 { int len = 0; int i = space[MAXSIZE-1].cur; while(i) { len++; i = space[i].cur; } return len; } bool ListInsert_SL(SLinkList space, int pos, int val) //在静态链表L中第pos个位置插入新的元素val,pos从1开始 { int i,j,k; if((pos < 1) || (pos > Listlength_SL(space)+1)) //不考虑满的情况 return false; i = Malloc_SL(space); //或得空闲元素的下标 j = MAXSIZE-1; if( 0 != i) { space[i].data = val; for(k = 0; k < pos-1; ++k) { j = space[j].cur; //找到第pos个元素之前的位置 } space[i].cur = space[j].cur; space[j].cur = i; return true; } return false; } bool ListDelete_SL(SLinkList space, int pos, int *val) //删除静态链表L中第pos个元素,并用val返回,pos从1开始 { int i, j, k; if((pos < 1) || (pos > Listlength_SL(space))) return false; k = MAXSIZE-1; for(i = 0; i < pos-1; ++i) { k = space[k].cur; //找到第pos个元素之前的位置 } j = space[k].cur; //待删除的元素 *val = space[j].data; space[k].cur = space[j].cur; Free_SL(space, j); return true; }
原文:http://www.cnblogs.com/yzy-blogs/p/6011712.html