静态链表

用数组描述的链表为静态链表,也称游标实现法。

这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,故仍具有链式存储结构的主要优点。

假设我们初始化完的链表为:

初始化的结构体数组大小为10

假设我们要在d后面插入e的话:

那我们要在b后面插入x呢?

我们已经看懂了插入,再来看一下删除操作,把c删掉:

下面为静态链表主要的一些代码:

#include<stdio.h>
#define MAX_SIZE 10
typedef int ElemType;
typedef struct Node{
	ElemType e;
	int cur;
}StaticList[MAX_SIZE];
void init(StaticList L){
	for(int i=0;i<MAX_SIZE;i++){
		L[i].cur=i+1;
		L[i].e=' ';
	}
	char c[]={'A','B','C','D','E','F'};
	for(int i=0;i<6;i++){
		if(i==0){
			int index=L[0].cur;
			L[index].e=c[i];
			L[0].cur=L[index].cur;
			L[index].cur=0;
			L[MAX_SIZE-1].cur=index;
		}else{
			int index=L[0].cur;
			L[index].e=c[i];
			L[0].cur=L[index].cur;
			L[index-1].cur=index;
			L[index].cur=0;
		}
	}
	L[0].e++;//代表长度
}
void show(StaticList L){
	for(int i=0;i<MAX_SIZE;i++){
		printf("%3d",L[i].cur);//游标
	}
	printf("\n");
	for(int i=0;i<MAX_SIZE;i++){
		printf("%3c",L[i].e);//元素
	}
	printf("\n");
	for(int i=0;i<MAX_SIZE;i++){
		printf("%3d",i);//角标
	}
	printf("\n");
}
void print(StaticList L){
	int k=MAX_SIZE-1;
	while(k!=0){
		k=L[k].cur;
		if(k==0){
			break;
		}else{
			printf("%c",L[k].e);
		}
	}
	printf("\n");
}
void insert(StaticList L,int position,ElemType e){
	int k=MAX_SIZE-1;
	for(int i=1;i<=position-1;i++){
		k=L[k].cur;
	}
	int index=L[0].cur;
	L[index].e=e;
	L[0].cur=L[index].cur;
	L[index].cur=L[k].cur;
	L[k].cur=index;
}
void delete(StaticList L,int position){
	int k=MAX_SIZE-1;
	for(int i=1;i<position;i++){
		k=L[k].cur;
	}
	int index=L[k].cur;
	L[k].cur=L[index].cur;
	L[index].cur=L[0].cur;
	L[0].cur=index;
	L[index].e=' ';
}
void main(){
	StaticList L;//代表一个结构体数组
	init(L);
	show(L);
	printf("打印:\n");
	print(L);
	insert(L,4,'G');
	show(L);
	printf("打印:\n");
	print(L);
	delete(L,3);
	show(L);
	printf("打印:\n");
	print(L);
}

运行结果为:

该代码和运行结果与我之前的例子不是同一种问题!