3.12 静态链表,与单链表的区别仅仅是把指针去掉
一般cc++程序不会用到,通常在没有指针的程序语言中使用,但是代码算法的思想还是很有必要见识下的。
一般cc++程序不会用到,通常在没有指针的程序语言中使用,但是代码算法的思想还是很有必要见识下的。
//线性表的静态链表存储结构 //假设链表的最大长度为1000 #define MAXSIZE 1000 typedef struct { ElemType data; //游标(Cursor),为0时表示无指向 int cur; } Component, /*对于不提供结构struct的程序设计语言,可以使用一对并行数组data和cur来处理*/ StaticLinkList[MAXSIZE]; //另外我们对数组(StaticLinkList)第一个和最后一个元素作为特殊元素处理,不存数据。我们通常把 //未被使用的数组元素称为备用链表。而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标; //而数组的最后一个元素的cur则存放第一个有数值元素的下标,相当于单链表中头节点作用,当整个链表为空时,则为0 //初始化链表 //将一维数组space中各分量链成一备用链表,space[0].cur为头指针,"0"表示空指针 Status InitList(StaticLinkList space) { int i; for(i = 0; i < MAXSIZE-1; i++) space[i].cur = i+1; //目前静态链表为空,最后一个元素的cur为0 space[MAXSIZE-1].cur=0; return OK; } //ListLength int ListLength(StaticLinkList L) { int j = 0; int i = L[MAXSIZE - 1].cur; while (i) //脑回路清奇...太牛x啦 { i=L[i].cur; j++; } return j; } //静态链表要解决的是:如何用静态模拟动态链表结构的存储空间的分配,需要时申请,无用时释放 //在动态链表中结点的申请和释放分别借用malloc()和free()两个函数来实现,在静态链表中操作的时数组,
//不存在像动态链表的结点申请和释放问题,所以我们需要自己实现这两个函数 //才可以做插入和删除操作。 //若备用空间链表非空,则返回分配的结点下标,否则返回0 int Malloc_SLL(StaticLinkList space) { //当前数组第一个元素的cur存的值,就是要返回的第一备用空闲的下标 int i = space[0].cur; //由于要拿出一份分量来使用了,所以我们就得把它的下一个分量用来做备份 if(space[0].cur) space[0].cur=space[i].cur; return i; } //在L中第i个元素之前插入新的数据元素e Status ListInsert(StaticLinkList L, int i, ElemType e) { int j,k,l; //注意k首先是最后一个元素的下标 k= MAXSIZE -1; if (i < 1 || i > ListLength(L)+1) return ERROR; //获得空间分量的下标 j = Malloc_SLL(L); if (j) { //将数据赋值给此分量的data L[j].data=e; //找到第i个元素之前的位置 for(l=1; l<=i-1; l++) k=L[k].cur; //注意:第一次的k为MAXSIZE -1;cur为存放第一份有数值元素的下标 //把第i个元素之前的cur赋值给新元素的cur L[j].cur=L[k].cur; //把新元素的下标赋值给第i个元素之前元素的cur L[k].cur=j; return OK; } return ERROR; } //将下标为k的空间结点回收到备用链表 void Free_SSL(StaticLinkList space, int k) { //把第一个元素cur值赋给要删除的分量cur space[k].cur=space[0].cur; space[0].cur=k; } //删除在L中第i个数据元素e Status ListDelete(StaticLinkList L, int i) { int j,k; if(i < 1 || i > ListLength(L)) return ERROR; k = MAXSIZE-1; for(j=1; j<=i-1;j++) k=L[k].cur; j = L[k].cur; L[k].cur=L[j].cur; Free_SSL(L, j); return OK; }
//静态链表的优缺点
优点:在插入操作时,只需修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点
缺点:没有解决连续存储分配带来的表长难以确定的问题;失去了顺序存储结构 随机存取的特性
优点:在插入操作时,只需修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点
缺点:没有解决连续存储分配带来的表长难以确定的问题;失去了顺序存储结构 随机存取的特性