Scratch 实现数据结构静态链表的建立及操作
scratch操作
对于没有指针的编程语言,可以用数组替代指针,来描述链表。让数组的每个元素由data和cur两部分组成,其中cur相当于链表的next指针,这种用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法。我们对数组的第一个和最后一个元素做特殊处理,不存数据。让数组的第一个元素cur存放第一个备用元素(未被占用的元素)下标,而数组的最后一个元素cur存放第一个有值的元素下标,相当于头结点作用。
数据结构
初始化静态链表
添加数据代码
在插入内容时,首先应对数组分配空间,否则程序无法运行!!
删除数据
回收空闲节点操作代码
计算静态链表的元素的个数
程序有改动,这里的判断NULL应该 改为‘ ’(空格)
插入数据代码
增加据代码
运行结果
C语言实现静态链表
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MAXSIZE 10
typedef char Elemtype;
typedef struct {
Elemtype data;
int cur;
}component,SlinkList[MAXSIZE];
int LocateElem_SL(SlinkList S, Elemtype e)
{
//在静态链表L中查找第1个值为e的元素
//若找到,则返回它在L中的位序,否则返回0
int i = S[0].cur;
while (i&&S[i].data != e)
i = S[i].cur;
return i;
}
void InitSpace_SL(SlinkList &space)
{
//将一维数组space中各分量链成一个备用链表,space[0].cur为头指针,
//“0”表示空指针
for (int i = 0; i < MAXSIZE - 1; ++i)
space[i].cur = i + 1;
space[MAXSIZE - 1].cur = 0;
}
int Malloc_SL(SlinkList &space)
{
//若备用链表非空,则返回分配的结点的下标,否则返回0
int i = space[0].cur;
if (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;
space[0].cur = k;
}
void difference(SlinkList &space, int &S)
{
//依次输入A和B的元素,在一维数组space中建立表示集合(A-B)U(B-A)
//的静态链表,S为其头指针。假设备用空间足够大,space[0].cur为其头指针
InitSpace_SL(space); //初始化备用空间
S = Malloc_SL(space); //生成S的头结点
int r = S; //r指向S的当前最后结点
int m, n,i;
scanf("%d%d", &m, &n); //输入A和B的元素个数
for (int j = 1; j <= m; j++) { //建立集合A的链表
i = Malloc_SL(space); //分配结点
scanf("%c", &space[i].data); //输入A的元素值
space[r].cur = i; //插入到表尾
r = i;
}
space[r].cur = 0; //尾结点的指针为空
for (int j = 1; j <= n; ++j) //一次输入B的元素,若不在当前表中,则插入,否则删除
{
int b,p,k;
scanf("%d", &b);
p = S; k = space[S].cur; //k指向集合A的第一个结点
while (k != space[r].cur&&space[k].data != b) //在当前表中查找
{
p = k;
k = space[k].cur;
}
if (k == space[r].cur)
{
i = Malloc_SL(space);
space[i].data = b;
space[i].cur = space[r].cur;
space[r].cur = i;
}
else
{
space[p].cur = space[k].cur;
Free_SL(space, k);
if (r == k)r = p;
}
}
}
void displayArr(component * array, int body) {
int tempBody = body;//tempBody准备做遍历使用
while (array[tempBody].cur) {
printf("%d,%d ", array[tempBody].data, array[tempBody].cur);
tempBody = array[tempBody].cur;
}
printf("%d,%d\n", array[tempBody].data, array[tempBody].cur);
}
int main() {
SlinkList space;
int x, y;
difference(space, x);
y = x;
while (y)
{//遍历静态链表
printf("%3d %c\n", y, space[y].data);
y = space[y].cur;
}
}