静态链表

 
/*  静态链表用一维数组表示链表便于在不设指针的高级程序语言中实现链表结构
	数组的一个分量表示一个结点,一个结点由两个域组成:
	数据域:data,用于存储要处理的数据元素
	游标域:cur,用于代替指针指示结点在数据中的位置
	特殊处理数组的第一个位置与最后一个位置
	最后一个位置的游标指标第一个有数据的结点(相当于链表的头结点)
	第一个位置的游标指标一个未使用的结点 */
#ifndef SLINKLIST_H
#define SLINKLIST_H
#define MAXSIZE 1000  //设定数组的最大值
typedef int ElemType; //设定数组的数据类型
typedef struct{
	ElemType data; //结点的数据域
	int cur;  //结点的游标域
}Node,SLinkList[MAXSIZE];
void InitList(SLinkList l); //初始化链表
void InsertList(SLinkList l,int i,ElemType e); //在链表的第i个位置插入元素
void DeleteList(SLinkList l,int i); //删除链表的第i个元素
int Malloc_SLL(SLinkList l); //申请空间
void Free_SLL(SLinkList l); //释放空间
int GetListLength(SLinkList l); //返回链表的长度
void Print(SLinkList l); //打印链表
#endif //SLINKLIST_H

#include "SLinkList.h"
#include <stdio.h>
void InitList(SLinkList l) //初始化链表
{
	for(int i = 0;i < MAXSIZE - 1;++i) //初始化链表的游标,使其全部形成链接
		l[i].cur = i + 1;
	l[MAXSIZE - 1].cur = 0; //初始化最后一个结点的游标为0
}
int Malloc_SLL(SLinkList l) //申请链表的剩余空间
{
	int j = l[0].cur;
	if(l[0].cur)
		l[0].cur = l[j].cur;
	return j;
}
void Free_SLL(SLinkList l,int j) //释放链表的空间
{
	l[j].cur = l[0].cur;
	l[0].cur = j;
}
void InsertList(SLinkList l,int i,ElemType e) //在链表的第i个位置插入元素e
{
	if(i < 1 || i > GetListLength(l) + 1) //超出范围退出
		return;
	int k = MAXSIZE - 1; //使K为最后一个结点游标
	for(int j = 0;j < i - 1;++j) 
		k = l[k].cur;
	int v = Malloc_SLL(l); //申请空间
	if(v) //如果有空间
	{
		l[v].data = e;
		l[v].cur = l[k].cur;
		l[k].cur = v;
	}
}
void DeleteList(SLinkList l,int i) //删除第i个位置的元素
{
	if(i < 1 || i > GetListLength(l)) //超出范围退出
		return;
	int k = MAXSIZE - 1; //K指示链表的最后一个结点
	for(int j = 0;j < i - 1;++j) //使k指示要删除的结点的前一个结点
		k = l[k].cur;
	int temp = l[k].cur;
	l[k].cur = l[temp].cur;
	Free_SLL(l,temp);
}
int GetListLength(SLinkList l) //返回链表的当前长度
{
	int j = 0;
	int k = l[MAXSIZE - 1].cur;
	while(k)
	{
		++j;
		k = l[k].cur;
	}
	return j;
}
void Print(SLinkList l) //打印链表
{
	int k = l[MAXSIZE - 1].cur;
	while(k)
	{
		printf("%d ",l[k].data);
		k = l[k].cur;
	}
	printf("\n");
}

#include "SLinkList.h"
#include <stdio.h>
int main()
{
	SLinkList l;
	InitList(l); //初始化链表
	for(int i = 0;i < 8;++i)
		InsertList(l,1,i);
	Print(l); //输出链表

	InsertList(l,3,22); //在链表的第3个位置插入22
	Print(l);

	DeleteList(l,7); //删除第8个位置的元素
	Print(l);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值