0
点赞
收藏
分享

微信扫一扫

数据结构——静态链表

西风白羽 2022-04-21 阅读 89
数据结构

#pragma once
#include<iostream>
template<class T>
class static_list
{
public:
	struct node
	{
		T data;//表示数据域
		int cur;//表示指针域
	};
	unsigned max_size;//最大长度
	node *list;
	unsigned size;//目前使用长度
	int sl_new();//分配空间
	void sl_delete(unsigned k);//释放空间
public:
	static_list(unsigned m=10);
	void insert(unsigned loc,T data);//插入空间
	void remove(unsigned loc);//删除空间
	void print();
};
template<class T>
static_list<T>::static_list(unsigned m)
{
	size = 0;
	max_size = m;
	list = new node[max_size];
	list[0].cur = -1;
	for (unsigned i = 1; i < max_size-1; i++)
		list[i].cur = i + 1;//初始化将每个指针指向下一位元素
	list[max_size - 1].cur = 0;//最后一个数组元素指针初始化为0
}
template<class T>
int static_list<T>::sl_new()
{
	//list[1].cur表示第一个未被分配的空间的位序
	unsigned i = list[1].cur;
	//思考极限情况,i=max_size-1,i不为0可以分配
	//但在这之后list[1].cur=list[max_size-1].cur=0
	//即list[1].cur=0,则之后将不能再分配
	if (i)//i为0时,不分配。
		list[1].cur = list[i].cur;
	return i;//返回申请的位序
	//函数只能和insert搭配使用,不能单独使用,
	//因为i不能直接拿来用,要判断是否为0
}
template<class T>
void static_list<T>::sl_delete(unsigned k)
{
	if (k<0 || k>size - 1)
		throw("out of range");
	unsigned temp = 0;//temp为head位序
	for (unsigned j = 0; j < k; j++)
		temp = list[temp].cur;
	//此时temp为物理上第k-1位数的位序
	unsigned i = list[temp].cur;//第k位数的位序
	list[temp].cur = list[i].cur;//将第k位数的指针赋给第k-1位数的指针
	//如果没有下面的操作,则第i个内存将无法使用
	//我们还要充分利用这个内存空间
	unsigned m = list[1].cur;
	if (i < m)//当i在m之前
	{
		list[1].cur = i;
		list[i].cur = m;
	}
	else
	{
		unsigned m1 = m;
		unsigned m2=0;
		while (i > m1)
		{
			m2 = m1;
			m1 = list[m1].cur;
		}
		list[m2].cur = i;
		list[i].cur = m1;
	}
}
template<class T>
void static_list<T>::insert(unsigned loc, T data)
{
	if (loc<0 || loc>size)
		throw("out of range");
	unsigned i = sl_new();//新分配的位序
	if (i)
	{
		unsigned j = 0;
		for (unsigned m = 0; m < loc; m++)
			j = list[j].cur;
		//此时j为物理上loc-1数的位序
		list[i].data = data;
		if (list[j].cur!=-1)
			list[i].cur = list[j].cur;
		list[j].cur = i;
	}
	else throw("insert error by new");
	size++;
}
template<class T>
void static_list<T>::remove(unsigned loc)
{
	sl_delete(loc);//基本就是删除
	size--;
}
template<class T>
void static_list<T>::print()
{
	unsigned i = list[0].cur;
	if (i == -1)
		return;
	int temp = size;
	while (temp--)
	{
		T data = list[i].data;
		i = list[i].cur;
		std::cout << data << " ";
	}
}

 

举报

相关推荐

0 条评论