</pre><pre name="code" class="cpp">#ifndef Linklist_H //避免重复包含Linklist.h头文件
#define Linklist_H
template<class DataType> //定义单链表的结点
struct Node
{
DataType data;
Node<DataType> *next;
};
template <class DataType> //类Linklist的声明
class Linklist
{
public:
Linklist();
Linklist(DataType a[],int n); //建立有n个元素的单链表
~Linklist(); //析构函数
int Locate(DataType x); //在单链表中查找值为x的元素序号
void Insert(int i,DataType x); //在第i个位置插入元素值为x的结点
DataType Delete(int i); //在单链表中删除第i个结点
void PrintList(); //按序号依次输出各元素
private:
Node<DataType>*first; //单链表的头指针
};
#endif
#include<iostream> //引入输入输出流
using namespace std;
#include"Linklist.h" //引入类Linklist
template <class DataType> //类Linklist的成员函数定义
Linklist<DataType>::Linklist()
{
first=new Node<DataType> //生成头结点
first->next=null; //头结点的指针域置空
}
template <class DataType>
Linklist<DataType>::Linklist(DataType a[],int n)
{
Node<DataType>*r,*s;
first=new Node<DataType>; //生成头结点
r=first; //尾指针初始化
for(int i=0;i<n;i++)
{
s=new Node<DataType>; //为每个数组元素建立一个结点
s->data=a[i]; //将结点s插入到终端结点之后
r->next=s;
r=s;
}
r->next=NULL; //将终端结点的指针域置空
}
template<class DataType>
Linklist<DataType>::~Linklist()
{
Node<DataType>*q=NULL; //释放单链表的每一个结点的存储空间
while(first!=NULL)
{
q=first; //暂存被释放结点
first=first->next; //first指向被释放结点的下一个结点
delete q;
}
}
template<class DataType>
void Linklist<DataType>::Insert(int i,DataType x)
{
Node<DataType>*p=first,*s=NULL; //工作指针p指向头结点
int count=0;
while(p!=NULL&&count<i-1) //查找第i-1个结点
{
p=p->next; //工作指针p后移
count++;
}
if(p==NULL)throw"位置"; //没有找到第i-1个结点
else
{
s=new Node<DataType>;s->data=x; //结点s的数据与为x
s->next=p->next;p->next=s; //将结点s插入到结点p之后
}
}
template<class DataType>
DataType Linklist<DataType>::Delete(int i)
{
Node<DataType>*p=first,*q=NULL;
DataType x;
int count=0;
while(p!=NULL&& count<i-1)
{
p=p->next;
count++;
}
if(p==NULL||p->next==NULL)
throw"位置";
else
{
q=p->next;x=q->data;
p->next=q->next;
delete q;return x;
}
}
template<class DataType>
int Linklist<DataType>::Locate(DataType x)
{
Node<DataType>*p=first->next;
int count=1;
while(p!=NULL)
{
if(p->data==x)return count;
p=p->next;count++;
}
return 0;
}
template<class DataType>
void Linklist<DataType>::PrintList()
{
Node<DataType>*p=first->next;
while(p!=NULL)
{
cout<<p->data<<"";
p=p->next;
}
cout<<endl;
}
#include<iostream> //引入输入输出流
using namespace std;
#include"Linklist1.cpp"
void main()
{
int r[5]={1,2,3,4,5};
Linklist<int>L(r,5);
cout<<"执行插入操作前数据为:"<<endl;
L.PrintList(); //显示链表中的所有元素
try
{
L.Insert(2,3); //在第2个位置插入值为3的元素
}
catch(char*s)
{ cout<<s<<endl;}
cout<<"执行插入操作后数据为:"<<endl;
L.PrintList(); //显示单链表的所有元素
cout<<"值为5的元素位置为:";
cout<<L.Locate(5)<<endl; //查找元素5,并返回在单链表中位置
cout<<"执行删除操作前数据为:"<<endl;
L.PrintList(); //显示单链表的所有元素
try
{
L.Delete(1); //删除第1个元素
}
catch(char *s)
{
cout<<s<<endl;
}
cout<<"执行删除操作后数据为:"<<endl;
L.PrintList(); //显示单链表的所有元素
}