静态链表的实现

/**
*2018-8-23 21:35
*静态链表的实现
*数组中第一个结点表示备用链表的第一个结点
*数组中最后一个结点表示链表的第一个结点
*当next域为0时均代表到了当前链表的结尾,因此有两个数组单元(0与MAX-1)无法存储目标数据
*
*/

#include<stdio.h> 
#define MAX 10 //此时静态链表中只能存储8个元素

typedef struct {
	int next;
	char e;
}elem;

typedef struct {
	elem data[MAX];
	int length;

}staticLinked;



staticLinked create();
void insert(staticLinked *linked, char e);
void delete(staticLinked *linked, char e);
int location(staticLinked *linked, char e);
int main() {

	staticLinked linkedList = create();

	insert(&linkedList, 'A');
	insert(&linkedList, 'B');
	insert(&linkedList, 'B');
	insert(&linkedList, 'C');
	insert(&linkedList, 'D');
	insert(&linkedList, 'D');
	insert(&linkedList, 'E');
	insert(&linkedList, 'E');
	insert(&linkedList, 'F');
	insert(&linkedList, 'F');
	insert(&linkedList, 'F');
	insert(&linkedList, 'F');
	delete(&linkedList, 'F');

	printf("%d,", linkedList.length);
	putchar('\n');
	for (size_t i = 0; i < MAX; i++)
	{
		printf("%d,", linkedList.data[i].next);
	}
	
	putchar('\n');
	for (size_t i = linkedList.data[MAX - 1].next; i != 0; i = linkedList.data[i].next)
	{
		printf("%c,", linkedList.data[i].e);
	}

	putchar('\n');
	printf("所查找元素的位置:%d\n", location(&linkedList, '2'));
	system("pause");
	return 0;
}

staticLinked create() {
	staticLinked linked = {
		{0},
		0
	};

	linked.data[MAX - 1].next = 0;
	linked.data[MAX - 2].next = 0;

	for (size_t i = 0; i < MAX - 2; i++)
		linked.data[i].next = i+1;

		return linked;
}

void insert(staticLinked *linked, char e) {
	if (linked->length < MAX - 2)
	{		
		//获取链表的第一个结点,为0表示没有
		int endPoint = MAX - 1;
		//获取链表的最后一个结点&判重(chong)
		while (linked->data[endPoint].next) {
			if (e == linked->data[linked->data[endPoint].next].e)
				return;
			endPoint = linked->data[endPoint].next;
		}
		//获取备用链表的第一个结点,为0表示没有
		int emptyLocation = linked->data[0].next;
		//获取当前空结点的下一个空结点
		linked->data[0].next = linked->data[emptyLocation].next;
		//插入指定数据
		linked->data[emptyLocation].e = e;
		//将插入的结点的下一个结点指针置为0,因为插入的结点一定是最后一个结点
		linked->data[emptyLocation].next = 0;
		
		//将插入的结点连接到链表的最后
		linked->data[endPoint].next = emptyLocation;
		//判断当前链表是否为空链表,如果是则将当前插入的结点作为第一个结点不是则不变
		if(!linked->data[MAX - 1].next)linked->data[MAX - 1].next = emptyLocation;
		//记录链表的数量
		linked->length++;
		
	}
}

void delete(staticLinked *linked, char e) {
	//头结点的位置
	int previous = MAX - 1;
	//当前结点的直接后继
	int nextPoint = linked->data[previous].next;
	//判断当前结点的直接后继是否存在
		while (nextPoint){
			//如果存在则比较直接后继的值是否与给定值相等
			//相等则进行删除操作,操作完成以后直接跳出循环,因为链表中元素唯一
			if (e == linked->data[nextPoint].e) {
				//previous保存待删除结点的直接前前驱
				//删除
				linked->data[previous].next = linked->data[nextPoint].next;
				//将删除的结点挂到备用链表队列
				linked->data[nextPoint].next = linked->data[0].next;
				linked->data[0].next = nextPoint;
				//将链表计数减一
				linked->length--;
				//跳出循环
				break;
			}
			//不相等则继续查找下一个结点
			previous = linked->data[previous].next;
			nextPoint = linked->data[previous].next;
	 }
}

int location(staticLinked *linked, char e) {
	//获取链表第一个结点
	int location = linked->data[MAX - 1].next;
	while (location){
		if ( e == linked->data[location].e)
			return location;
		else location = linked->data[location].next;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值