//10.6 静态链表
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30
typedef struct
{
char data; //data 为节点的数信息
int cursor; //cursor 标识直接后继节点
}SNode; //静态链表节点类型
void InsertList(SNode L[], int i, char x) //在静态链表中插入元素
{
int j, j1, j2, k;
j = L[0].cursor; //j 指向第一个数据节点
if (1 == i)
{
if (0 == j) //静态链表为空
{
L[1].data = x; //将小放入节点L[1]中
L[0].cursor = 1; //头指针cursor 指向这个新插入的节点
L[1].cursor = 0; //置链尾标志
}
else
{
k = j + 1;
while (k != j) //在数组中循环查找存放x 的位置
{
if (L[k].cursor == -1) //找到空位置
{
break;
}
else
{
k = (k + 1) % MAXSIZE; //否则查找下一个位置
}
}
if (k != j) //在数组中找到一个空位置来存放x
{
L[k].data = x;
L[k].cursor = L[0].cursor; //将其插入到静态链表表头
L[0].cursor = k;
}
else
{
printf("List overflow!\n"); //链表已满无法插入
}
}
}
else //i != 1 不是作为第一个节点插入
{
k = 0;
while (k < i - 2 && j != 0) //查找第i-1 个节点, j 不等于0 则表示
{
k++;
j = L[j].cursor;
}
if (0 == j) //查完整个静态链表未找到第i-1 个节点,即链表长度小于i-1 个节点
{
printf("Insert error\n");
}
else
{
j1 = j; //找到第i-1 个节点
j2 = L[j].cursor; //用j2 保存原L[j].cursor 值,此值为第i个节点的位置值
k = j + 1;
while (k != j) //在数组中循环查找存放x 的位置
{
if (L[k].cursor == -1) //找到空位置
{
break;
}
else
{
k = (k + 1) % MAXSIZE; //否则查找下一个位置
}
}
if (k != j) //在数组中找到一个空位置来存放x
{
L[k].data = x;
L[j1].cursor = k; //作为第i 个节点链入倒静态链表
L[k].cursor = j2; //新节点之后再链接上原第i 个节点
}
else
{
printf("List overflow!\n"); //链表已满,无法插入
}
}
}
}
void print(SNode *L)
{
int i;
i = L[0].cursor; //从静态链表的表头元素开始输出
while (i != 0)
{
printf("%c ", L[i].data);
i = L[i].cursor;
}
printf("\n");
}
int main()
{
SNode L[MAXSIZE];
int i;
char x;
for (i = 1; i < MAXSIZE; i++) //静态链表初始化
{
L[i].cursor = -1;
}
L[0].cursor = 0; //静态链表初始为空标志(0 为链尾)
i = 1;
printf("Input element of llist\n"); //建立静态链表
scanf("%c", &x);
while (x != '\n')
{
InsertList(L, i, x);
i++;
scanf("%c", &x);
}
printf("Input site and element of insert\n");
scanf("%d %c", &i, &x); //输入要插入元素的位置
InsertList(L, i, x); //在静态链表中插入元素
printf("Output list\n");
print(L); //输出静态链表
return 0;
}
10.6静态链表
最新推荐文章于 2025-04-08 23:07:19 发布