#include <iostream>
using namespace std;
const int maxSize=100;//静态链表的大小
template <class T>
struct SLinkNode
{
T data;
int link;
};//结点类定义
template <class T>
class StaticList{
int vail;//可分配空间的起始位置
SLinkNode<T> elem[maxSize] ;
public:
void InitList();
int Length();//长度
int Search(T x);//查询
int Locate(int i);//定位某个位置
bool Append(T x);//末尾添加
bool Insert(int i,T x);//插入
bool Remove(int i);//删除
bool IsEmpty();//判断是否为空
void output();//输出
};
template <class T>
void StaticList<T>::InitList()
{
elem[0].link=-1;
vail=1;//从1开始建立带头结点的空链表
for(int i=1;i<maxSize-1;i++)
{
elem[i].link=i+1;
}
elem[maxSize-1].link=-1;
};
template <class T>
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>
bool StaticList<T>::IsEmpty()
{
if(elem[0].link==-1)//判断是否为空
return true;
else
return false;
};
template <class T>
int StaticList<T>::Search(T x)
{
//查找指定值
int p=elem[0].link;
while(p!=-1)
{
if(elem[p].data=x)//找到
{
cout<<"查找成功" <<endl;
break;
}
else
p=elem[p].link;//移动
}
return p;
};
template <class T>
int StaticList<T>::Locate(int i) //定位函数
{
if(i<0)
{
return -1;
}
if(0==i)
{
return 0;
}
int j=1;
int p=elem[0].link;
while(p!=-1&&j<i)//未到结尾且位置未到
{
p=elem[p].link;//移动
j++;
}
return p;
}
template <class T>
bool StaticList<T>::Append(T x)//表尾添加结点
{
if(-1==vail)
return false;//没有空间
int q=vail;//分配结点
vail=elem[vail].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>
bool StaticList<T>::Insert(int i,T x){//在第i个结点后插入新的结点
int p=Locate(i);
if(i=-1)
{
return false;//找不到
}
int q=vail;//分配结点
vail=elem[vail].link;//原来的位置进行移动
elem[q].data=x;
elem[q].link=elem[p].link;//链入;
elem[p].link=q;
return true;
};
template <class T>
bool StaticList<T>::Remove(int i)//删除第i个位置的元素
{
int p=Locate(i-1);//定位
if(-1==p)
{
return false;//出错 的情况
}
int q=elem[p].link;//取
elem[p].link=elem[q].link;//摘下
elem[q].link=vail;
vail=q;
return true;//释放空间
};
template <class T>
void StaticList<T>::output()
{
for(int i=1;i<=Length();i++)//注意这里的下标
{
cout<<elem[Locate(i)].data<<" " ;
}
cout<<endl;
};
int main()
{
cout<<"---------静态链表-------"<<endl;
StaticList<int> stl;
cout<<"建立成功"<<endl;
stl.InitList();
cout<<"初始化成功"<<endl;
int choice;
bool end=false;
while(!end)
{
cout<<"1:插入元素"<<endl;
cout<<"2:删除元素" <<endl;
cout<<"3:获取链表长度"<<endl;
cout<<"4:输出链表元素" <<endl;
cout<<"5:判断链表是否为空"<<endl;
cout<<"6:查找指定元素"<<endl;
cout<<"7:退出"<<endl;
cout<<"请输入操作"<<endl;
cin>>choice;
switch(choice)
{
case 1:
cout<<"请输入要插入的元素个数"<<endl;
int n;
cin>>n;
cout<<"请输入要插入的元素"<<endl;
int a[100];//可修改
for(int i=0;i<n;i++)
{
cin>>a[i];
stl.Append(a[i]);
}
cout<<"插入后的链表元素为"<<endl;
stl.output();
break;
case 2:
cout<<"请输入要删除的位置"<<endl;
int w;
cin>>w;
stl.Remove(w);
cout<<"删除后链表元素为"<<endl;
stl.output();
break;
case 3:
cout<<"链表长度为"<<stl.Length()<<endl;
break;
case 4:
stl.output();
break;
case 5:
if( stl.IsEmpty())
{
cout<<"链表为空!"<<endl;
}
else
cout<<"链表非空!";
break;
case 6:
cout<<"请输入要查找的值"<<endl;
int x;
cin>>x;
stl.Search(x);
break;
case 7:
end=true;
break;
default:
cout<<"输入错误请重新输入!!!"<<endl;
}
}
return 0;
}
静态链表类模板实现(带测试代码)
最新推荐文章于 2023-04-09 22:21:36 发布