一、解析
对于静态链表,链表就是结点中保存下一个元素的地址。而静态呢就是一个数组保存下个地址的索引位置达到节省空间位置。参考书上P31-P34
二、存储结构
//静态链表
typedef struct{
ElemType data;
int cur;//这个cur跟链表的next差不多
}component, SLinkList[MAXSIZE];
三、操作
//======================================静态链表===============
#define MAXSIZE 100//链表的最大长度
//静态链表
typedef struct{
ElemType data;
int cur;//这个cur跟链表的next差不多
}component, SLinkList[MAXSIZE];
//空链表的头位置为0;
//int start = -1;//非空链表头 -1代表还没生成
int LocateElem_SL(SLinkList S, ElemType e){
//在静态链表中查找第1个值为e的元素
//若找到,则返回它在L中的为序,否则返回0
return 0;
}
void InitSpace_SL(SLinkList &space){
//将一维数组space中各分量链成一个备用链表,space[0],cer为头指针 空链的头指针
for (int i = 0; i < MAXSIZE - 1; i++)
{
space[i].cur = i + 1;
//space[i].data = i + 1;
}
space[MAXSIZE - 1].cur = 0;
//space[MAXSIZE - 1].data = 0;
}
int Malloc_SL(SLinkList &space){
//若备用空间非空,则返回分配的结点下标,否则返回0
int i = space[0].cur;//从空链分配下来的一个空的空闲下标
if (i)
{
//如果这个i不等于0的情况 证明空链表还有空间 将这个i分配出去
//更新空链表的头结点的cur
space[0].cur = space[i].cur;
return i;
}
//空链表没有空间了
return 0;
}
void Free_SL(SLinkList &space, int k){
//将下标为k的空闲结点回收到备用链表 //这里无视了k的合法性
space[k].cur = space[0].cur;
space[0].cur = k;
}
void ListDelete_SL(SLinkList &space, int i, int start){
//删除静态链表的第i个元素 start指明静态链表中元素的首结点
//这里不做i的非法判断了
//要删掉第i和位置 先去到第i-1个位置
int p = space[start].cur;//跳过头结点的第0个元素的位置
for (int j = 0; j < i - 1; j++)
{
p = space[p].cur;
}
int k = space[p].cur;
space[p].cur = space[k].cur;
Free_SL(space, k);
//printf("\n第i-1个位置 %d\n",space[p].data);
}
void CreateList_SL(SLinkList &space, int* nums, int size, int &start){
//创建静态链表 nums是放置的元素 num是放置的元素个数
InitSpace_SL(space);
start = Malloc_SL(space);//分配的头结点的位置
int tail = start;//有数据链表的最后位置
for (int i = 0; i < size; i++)
{
int j = Malloc_SL(space);//分配出的J位置是空闲位置
space[j].data = nums[i];
space[tail].cur = j;
tail = j;
}
space[tail].cur = 0;//尾指针指向空的头
}
void PrintfList_SL(SLinkList &space, int start){
int i = start;
if (start == -1)
{
//链表中还没元素
printf("链表中还没元素");
return;
}
while (space[i].cur)
{
i = space[i].cur;//移动下个结点
printf("%d:", space[i].data);
}
}
void difference(SLinkList lA, SLinkList lB, SLinkList &lC){
//(A-B)U(B-A)对于算法2.17感觉没什么好说的 书上的写法感觉很乱 用scanf搞事情,我改了下 参数
//将A集合与B集合进行算法2.17然后保存到lC
}
四、执行
//静态链表
SLinkList listA;
int numsA[4] = { 1, 2, 3, 4 };
int startA = -1;
CreateList_SL(listA,numsA,4,startA);
ListDelete_SL(listA,2,startA);
PrintfList_SL(listA,startA);
输出:
1:2:4:请按任意键继续. . .