昨天写的单链表,我们称为动态链表,它在计算机内没有固定的储存位置,又或者说,他的储存范围是整个内存空间。
而今天我们介绍一个新的线性表结构——**静态链表**
那么我们来看一下什么是静态链表:我们通常会说静态链表是顺序表和动态链表的结合,这是为什么呢?这是因为,静态链表和顺序表一样限制了有限的空间,而在这个空间内,用链表的方式来排序。
在静态链表中,和动态链表一样分为两个区域,但称呼却不相同:数据域和游标。这个游标就像是类似于指针一样指向下一个结点,但他却是一个int型的变量,他真正所指向的也不过是下一个数组的下标。【我们姑且可以吧静态链表看作是一个巨大的数组】
接下来我们来说一下静态链表的优点吧:
它将顺序表和动态链表相结合,所以即继承了顺序表的数组存储,便于遍历操作,又可以像动态链表中插入一样,只需要轻微改动就可以完美插入,避免了顺序表中的大量移动,而对于空间限制问题,在静态链表中,为了提高空间重复利用,我们可以将不用的结点放入备用链表中,具体的图片我这没有,大家可以找一下,会很方便理解的。简单的说一下就是在申请的巨大的空间内,我们从数组1的位置开始数据链表构建,数据链表由下标0作为结尾,也就是最后指向数组0的时候就结束了,而为了方便对于空间的管理,我们从数组0开始,将没有用的结点串成一条备用链表。
介绍的差不多了,那么照例将代码贴上:
#include<stdio.h>
#define maxSize 7
typedef struct{
int data;
int cur;
}component;
void reserveArr(component *array){
int i;
for( i = 0; i < maxSize; i++){
array[i].cur = i+1;
}
array[maxSize-1].cur = 0;
}
int mallocArr(component *array){
int i = array[0].cur;
if(array[0].cur){
array[0].cur = array[i].cur;
}
return i;
}
int initArr(component *array){
reserveArr(array);
int body = mallocArr(array);
int tempBody = body;
int i;
for(i = 1; i < 5; i++){
int j = mallocArr(array);
array[tempBody].cur = j;
array[j].data = 'a'+i-1;
tempBody = j;
}
array[tempBody].cur = 0;
return body;
}
int selectElem(component *array, int body, char elem){
int tempBody = body;
while(array[tempBody].cur != 0){
if(array[tempBody].data == elem){
return tempBody;
}
tempBody = array[tempBody].cur;
}
return -1;
}
void amendElem(component *array, int body, char oldElem, char newElem){
int add = selectElem(array, body, oldElem);
if(add == -1){
printf("无更改元素");
return;
}
array[add].data = newElem;
}
void insertArr(component *array, int body, int add, char a){
int tempBody = body;
int i;
for( i = 1; i < add; i++){
tempBody = array[tempBody].cur;
}
int insert = mallocArr(array);
array[insert].cur = array[tempBody].cur;
array[insert].data = a;
array[tempBody].cur = insert;
}
void deletArr(component *array, int body, char a){
int tempBody = body;
while(array[tempBody].data != a){
tempBody = array[tempBody].cur;
if(tempBody == 0){
printf("链表中没有该数据");
return;
}
}
int del = tempBody;
tempBody = body;
while(array[tempBody].cur != del){
tempBody = array[tempBody].cur;
}
array[tempBody].cur = array[del].cur;
freeArr(array, del);
}
void freeArr(component *array, int k){
array[k].cur = array[0].cur;
array[0].cur = k;
}
void displayArr(component *array, int body){
int tempBody = body;
while(array[tempBody].cur){
printf("%c,%d\n", array[tempBody].data,array[tempBody].cur);
tempBody = array[tempBody].cur;
}
printf("%c,%d\n", array[tempBody].data,array[tempBody].cur);
}
int main(){
component array[maxSize];
int body = initArr(array);
printf("静态链表为:\n");
displayArr(array, body);
printf("在地3的位置上插入结点'e':\n");
insertArr(array, body, 3, 'e');
displayArr(array, body);
printf("删除数据域为'a'的结点:\n");
deletArr(array, body, 'a');
displayArr(array, body);
printf("查找数据域为'e'的结点的位置:\n");
int selectAdd = selectElem(array, body, 'e');
printf("%d\n", selectAdd);
printf("将结点'e'改为'h':\n");
amendElem(array, body, 'e', 'h');
displayArr(array, body);
return 0;
}