#include <iostream>
using namespace std;
template<typename DataType>
struct Node
{
DataType data;
Node<DataType> *next;//指针的类型是指针所指向的类型
};
template<typename DataType>
class LinkList
{
public:
LinkList(){}
LinkList(DataType a[],int n);
~LinkList();
int Length();
DataType Get(int i); //按位查找
int Locate(DataType x); //按值查找,返回下标
void Insert(int i,DataType x);
DataType Delete(int i); //返回值为了存储被删掉的结点数据域的值
bool Empty(); //检查是否为空
void printlist();
private:
Node<DataType>*first;
};
template<typename DataType>LinkList<DataType>::LinkList()
{
first=new Node<DataType>;
first->next=NULL;
}
template<typename DataType>
bool LinkList<DataType>::Empty()
{
if(first->next==NULL)
return true;
else
return false;
}
template<typename DataType>
void LinkList<DataType>::printlist()
{
Node<DataType>*p;
p=first->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
template<typename DataType>
int LinkList<DataType>::Length()
{
Node<DataType>*p=first->next;
int cnt=0;
while(p!=NULL)
{
p=p->next;
cnt++;
}
return cnt;
}
template<typename DataType>
DataType LinkList<DataType>::Get(int i)
{
Node<DataType>*p=first->next;
int cnt=1;
while(p!=NULL&&cnt<i)
{
p=p->next;
cnt++;
}
if(p==NULL)
cout<<"查找位置错误"<<endl;
else
return p->data;
}
template<typename DataType>
int LinkList<DataType>::Locate(DataType x)
{
Node<DataType>*p=first->next;
int cnt=1;
while(p!=NULL)
{
if(p->data==x)
{
return cnt;
}
p=p->next;
cnt++;
}
return 0;
}
template<typename DataType>
void LinkList<DataType>::Insert(int i,DataType x)
{
Node<DataType>*p=first,*s=NULL;
int cnt=0;
while(p!=NULL&&cnt<i-1)
{
p=p->next;
cnt++;
}
if(p==NULL)
cout<<"插入位置错误"<<endl;
else{
s=new Node<DataType>;
s->data=x;
s->next=p->next;
p->next=s;
}
}
/*
//头插法,因为每次插在头结点后面,所以会出现倒序
template<typename DataType>
LinkList<DataType>::LinkList(DataType a[],int n)
{
first=new Node<DataType>;
first->next=NULL;
for(int i=0;i<n;i++)
{
Node<DataType> *s=NULL;
s=new Node<DataType>;
s->data=a[i];
s->next=first->next;
first->next=s;
}
}
*/
//尾插法,传入的数据正序排列
template<typename DataType>
LinkList<DataType>::LinkList(DataType a[],int n)
{
first=new Node<DataType>;
Node<DataType>*r=first,*s=NULL;
for(int i=0;i<n;i++)
{
s=new Node<DataType>;
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
template<typename DataType>
DataType LinkList<DataType>::Delete(int i)
{
DataType x;
Node<DataType>*p=first,*q=NULL;
int cnt=0;
while(p!=NULL&&cnt<i-1)
{
p=p->next;
cnt++;
}
if(p==NULL||p->next==NULL)//p不存在或者p无后继
{
cout<<"删除位置错误"<<endl;
}
else{
q=p->next;
x=q->data; //暂存被删结点
p->next=q->next; //摘链
delete q;
return x;
}
}
template<typename DataType>
LinkList<DataType>::~LinkList()
{
Node<DataType>*p=first;
while(first!=NULL)
{
first=first->next;
delete p;
p=first;
}
}
int main()
{
return 0;
}