静态链表(c++)

#pragma once

#include <iostream>

using std::cout;
using std::endl;

const int maxSize = 100;					//静态链表大小

template<typename T>
struct SLinkNode {
	T data;									//结点数据
	int link;								//结点链接指针
};

template<class T>
class StaticList {
private:
	SLinkNode<T> elem[maxSize];
	int avil;								//当前可分配空间首地址
public:
	void InitList();
	int Length();							//计算静态链表的长度
	int Search(T x);						//在静态链表中查找具有给定值的结点
	int Locate(int i);						//在静态链表中查找第i个结点
	bool Append(T x);						//在静态链表的表尾追加一个新结点
	bool Insert(int i, T x);				//在静态链表第i个结点后插入新结点
	bool Remove(int i);						//在静态链表中释放第i个结点
	bool IsEmpty();							//判链表空否?
	void output();
};

template<class T>
inline void StaticList<T>::InitList()
{
	//将链表空间初始化。
	elem[0].link = -1;
	avil = 1;
	//当前可分配空间从 1 开始建立带头结点的空链表
	for (int i = 1; i < maxSize - 1; i++)
	{
		elem[i].link = i + 1;				//构成空闲链接表
	}
	elem[maxSize - 1].link = -1;			//链表收尾
}

template<class T>
inline int StaticList<T>::Length()
{
	//计算静态链表的长度
	int p = elem[0].link;
	int i = 0;
	while (p != -1)
	{
		p = elem[p].link;
		i++;
	}
	return i;
}

template<class T>
inline int StaticList<T>::Search(T x)
{
	//在静态链表中查找具有给定值的结点。
	int p = elem[0].link;					//指针p指向链表第一个结点
	while (p != -1)
		if (elem[p].data == x) break;
		else p = elem[p].link;
	return p;
}

template<class T>
inline int StaticList<T>::Locate(int i)
{
	//在静态链表中查找第i个结点
	if (i < 0) return -1;					//参数不合理
	if (i == 0) return 0;
	int j = 1, p = elem[0].link;
	while (p != -1 && j < i)				//循环查找第i号结点
	{
		p = elem[p].link;
		j++;
	}
	return p;
}

template<class T>
inline bool StaticList<T>::Append(T x)
{
	//在静态链表的表尾追加一个新结点
	if (avil == -1) return false;			//追加失败
	int q = avil;
	avil = elem[avil].link;
	elem[q].data = x;
	elem[q].link = -1;
	int p = 0;
	while (elem[p].link != -1)
		p = elem[p].link;
	elem[p].link = q;						//追加

	return true;
}

template<class T>
inline bool StaticList<T>::Insert(int i, T x)
{
	//在静态链表第i个结点后面插入新结点。
	int p = Locate(i);
	if (p == -1) return false;				//找不到结点
	int q = avil;
	avil = elem[avil].link;
	elem[q].data = x;
	elem[q].link = elem[p].link;			//链入
	elem[p].link = q;
	return true;
}

template<class T>
inline bool StaticList<T>::Remove(int i)
{
	//在静态链表中释放第i个结点。
	int p = Locate(i - 1);
	if (p == -1) return false;				//找不到结点
	int q = elem[p].link;					//第i号节点
	elem[p].link = elem[q].link;
	elem[q].link = avil;					//释放
	avil = q;
	return true;
}

template<class T>
inline bool StaticList<T>::IsEmpty()
{
	//判链表空否?
	if (elem[0].link == -1) return true;
	else return true;
}

template<class T>
inline void StaticList<T>::output()
{
	int p = elem[0].link;
	while (p != -1)
	{
		cout << elem[p].data << " ";
		p = elem[p].link;
	}
	cout << endl;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林家小院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值