#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 << " ";
}
}