看了一条题目静态链表
所心去了一下静态链表。这个我以前没学过。
设有MAXSIZEz个结点
第一个结点用来存储第一个备用结点的下标。
最后一个结点用来存储这个链表第一个元素的下标,相当于头指针
下面代码中的注释是我对静态链表的理解
#include <stdio.h>
#define MAXSIZE 10
typedef int DataType;
typedef struct node{
DataType data; //一个结点中的数据域
int cur; //一个结点中的指针域
}Node;
Node space[MAXSIZE]; //相当于有MAXSIZE个结点,只不这里的结点已经有确定好个数了
void init() //对每个结点进行初始化
{ /*第一个结点和最后一个结点不使用,第一个结点用来存储第一个备用结点的下标*/
for(int i = 0;i < MAXSIZE-1;i++){ //所以才开始的时候为1
space[i].cur = i+1;
}
space[MAXSIZE-1].cur = 0; //最后一个结点用来存储的是 有数据的第一个元素的下标,相当于头指针,才开始默认为0
}
void insert(int n,DataType x)
{
int j = 1;
int k = MAXSIZE-1;
while(j <= n-1){ //找到要插入的位置,
k = space[k].cur;
j++;
}
int t = space[0].cur; // 找到第一个备用结点的下标
space[0].cur = space[t].cur; // 将第一个备用结点的下标进行改变
space[t].data = x;
space[t].cur = space[k].cur;
space[k].cur = t;
}
void travers()
{
int i = space[MAXSIZE-1].cur;
while(i){ //i为0表示已经遍历结束了
printf("%d\n",space[i].data);
i = space[i].cur;
}
}
void del(int n) //删除第n个元素
{
int i = 1;
int k = MAXSIZE-1;
while(i <= n-1){ //找到要删除的位置
i++;
k = space[k].cur;
}
int p = space[k].cur;
space[k].cur = space[p].cur; //将这个元素进行删除
/*因为这个元素已经被删除了,所以这个元素要成为备用结点*/
space[p].cur = space[0].cur;
space[0].cur = p;
}
int main()
{
init(); //初始化
for(int i = 0;i < 5;i++){
int n;
DataType x;
scanf("%d %d",&n,&x);
insert(n,x);//在第n个位置插入x
travers(); //遍历
}
for(int i = 0;i < 3;i++){
int n;
scanf("%d",&n);//删除第n个元素
del(n);
travers(); //遍历
}
return 0;
}