/****************************************仅作了解,几乎用不到**************************************
静态链表:数组元素都是由两个数据域组成,data 和 cur. 也就是说数组的每个下标都对应一个data和一个cur.
数据域data用来存放数据元素,及我们需要处理的元素;而游标则相当于单链表中的next指针,存放着该元素的后继在数组中的下标。
数组的第一个和最后一个元素需要做特殊元素处理,不存数据。通常,把未被使用的数组元素称为备用链表。
数组第一个元素,及下标为0的元素的cur就存放备用链表的第一个结点的下标;
而数组的最后一个元素的cur则存放第一个有数值元素的下标,相当于单链表中头结点的作用。
************************************************************************************************/
#include <malloc.h>
#define MAXSIZE 1000 //存储空间初始分配量,为了方便数据插入,通常需要大点的数组
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType; //ElemType 数据类型
typedef int Status;
typedef struct
{
ElemType data; //数据
int cur; //游标,0为无向游标
}Component, StaticLinkList[MAXSIZE];
// 初始化数组状态
Status InitList(StaticLinkList space)
{
int i;
for( i = 0; i<MAXSIZE; i++)
space[i].cur = i+1;
space[MAXSIZE-1].cur = 0;
return OK;
}
// 静态链表的插入操作
/* 将所有未被使用过的以及已经被删除的分量用游标链成一个备用表,每当需要插入时,遍可以从备用链表中取得第一个结点作为待插入新结点 */
/*若备用空间链表非空,则返回分配的结点下标,否则返回0*/
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].cur; //当前数组的第一个元素的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,i;
k = MAXSIZE - 1; //注意K首先是最后一个元素的下标
if(i<1 || i>ListLength(L) + 1)
return ERROR;
j = Malloc_SLL(L); //获得空闲分量的下标
if(j)
{
L[j].data = e; //将数据赋值给此分量的data
for(l = 1; l<= i - 1; l++) //找到第i个元素之前的位置
k = L[k].cur;
L[j].cur = L[k].cur; //把第i个元素之前的cur赋值给新的元素cur
L[k].cur = j; //把新元素的下标赋值给第i个元素之前元素的cur
return OK;
}
return ERROR;
}
线性表->静态链表(未完)
最新推荐文章于 2024-06-12 23:16:48 发布