数据结构学习(三)——静态链表-使用c语言实现

用数组描述的链表叫做静态链表


静态链表 数组的两个元素都是由数据域组成的,data和cur,数组的每一个下标对应一个data和一个cur。数据域data用来存放数据元素;游标cur相当于单链表里的next指针,存放该元素的后继在数组的下标。


静态链表的初始化构建:


列表中插入数据:


代码如下:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000//最大长度为1000
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct {
	ElemType data;
	int cur;
}Component,StaticLinkList[MAXSIZE];

//将一堆数组space中各分量链成一备用链表
//space[0].cur为头指针
Status InitList(StaticLinkList space) {
	int i;
	for (i = 0; i < MAXSIZE - 1; i++)
		space[i].cur = i + 1;
	space[MAXSIZE - 1].cur = 0;//目前静态链表为空,最后一个元素的cur为0,为头结点
	return OK;
}

//若备用空间链表非空,则返回分配的节点下标,否则返回0
int Malloc_SLL(StaticLinkList space) {
	int i = space[0].cur;//当前数组第一个元素的cur存的值,就是要返回第一个备用空闲的下标
	if (space[0].cur)
		space[0].cur = space[i].cur;//由于拿出一个分量来使用了,所以把下一个分量用来做备用
	return i;
}                          

//获取静态链表的数组长度
int ListLength(StaticLinkList L) {
	int k;
	k = MAXSIZE - 1;
	int j = 0;

	if (L[k].cur == 0) {
		return ERROR;//空数组
	}
	while (L[k].cur)//上标不为0 时
	{
		k = L[k].cur;
		j++;
	}
	return j;
}

//在第数组L中第i个元素前插入
Status ListInsert(StaticLinkList L, int i, ElemType e) {
	int j, k, l;
	k = MAXSIZE - 1;//k首先是最后一个元素的下标,他的cur用来存放第一个插入元素的下标,相当于头结点
	if (i<1 || i>ListLength(L) + 1) {
		return ERROR;
	}
	j = Malloc_SLL(L);//获得空闲量下标
	if (j) {
		L[j].data = e;//将数据给他
		for (l = 1; l <= i - 1; l++) {//找到第i个元素之前的位置
			k = L[k].cur;
		}
		L[j].cur = L[k].cur;//把第i个元素之前的cur赋值给他
		L[k].cur = j;//把空闲量的下标赋值给第i个元素之前的元素的cur
		return OK;
	}
}

静态链表中删除元素:


代码:

//删除在L中的第i个元素
Status ListDelete(StaticLinkList L, int i) {
	int j, k;
	if (i<1 || i>ListLength(L)) {
		return ERROR;
	}
	k = MAXSIZE - 1;
	for (j = 1; j <= i-1 ; j++) {
		k = L[k].cur;
	}

	j = L[k].cur;
	L[k].cur = L[j].cur;
	L[j].data = NULL;
	Free_SSL(L, k);
}


//将下标为k的空闲节点 回收到备用链表
void Free_SSL(StaticLinkList space, int k) {
	space[k].cur = space[0].cur;
	space[0].cur = k;
}

比较:



 

猜你喜欢

转载自blog.csdn.net/nihao561/article/details/80667200