静态链表
静态链表就是结合了单链表与顺序表的特点,既可以有效的利用内存空间,又可以根据节点信息不按内存空间顺序排列元素。一个静态链表有数据链表和备用链表,通常,备用链表的表头放在0节点上,可以通过访问0节点是否具有数据信息来确定该静态链表是否已经满了
静态链表插入元素
例如,在图 1 的基础,将元素 4 添加到静态链表中的第 3 个位置上,实现过程如下:
1、从备用链表中摘除一个节点,用于存储元素 4;
2、找到表中第 2 个节点(添加位置的前一个节点,这里是数据元素 2),将元素 2 的游标赋值给新元素 4;
3、将元素 4 所在数组中的下标赋值给元素 2 的游标;
经过以上几步操作,数据元素 4 就成功地添加到了静态链表中,此时新的静态链表如图 2 所示:
注意,插入的元素是在静态链表的第三个节点,原来的静态链表一共有三个节点,现在插入一个就变成了四个节点,a【3】=【3,0】在插入操作结束后仍是链表的尾部节点。但是第二个节点的next要从3变成4了,虽然内存位置没有发生变化,但是逻辑上的顺序已经发生了变化。新插入元素的next是3。
//向链表中插入数据,body表示链表的头结点在数组中的位置,add表示插入元素的位置,a表示要插入的数据
void insertArr(component * array,int body,int add,char a){
int tempBody=body;//tempBody做遍历结构体数组使用
//找到要插入位置的上一个结点在数组中的位置
for (int i=1; i<add; i++) {
tempBody=array[tempBody].cur;
}
int insert=mallocArr(array);//申请空间,准备插入
array[insert].data=a;
array[insert].cur=array[tempBody].cur;//新插入结点的游标等于其直接前驱结点的游标
array[tempBody].cur=insert;//直接前驱结点的游标等于新插入结点所在数组中的下标
}
静态链表增删查改完整程序
#include <stdio.h>
#define maxSize 7
typedef struct {
char data;
int cur;
}component;
//将结构体数组中所有分量链接到备用链表中
void reserveArr(component *array);
//初始化静态链表
int initArr(component *array);
//向链表中插入数据,body表示链表的头结点在数组中的位置,add表示插入元素的位置,a表示要插入的数据
void insertArr(component * array,int body,int add,char a);
//删除链表中含有字符a的结点
void deletArr(component * array,int body,char a);
//查找存储有字符elem的结点在数组的位置
int selectElem(component