运行环境:Code::Blocks 17.12
顺序表
#include<iostream>
using namespace std;
const int MaxSize=100;
template<class T>
class Seqlist
{
public:
Seqlist(){};
Seqlist(T a[],int n);
~Seqlist(){};
void Insert(T x,int i);
T Delete(int i);
T Get(int i);
int Length();
int Locate(T x);
void Disply();
void Delete_All(T x);
private:
int length;
T data[MaxSize];
};
template<class T>
Seqlist<T>::Seqlist(T a[],int n)
{
if(n>MaxSize){throw "参数非法";}
for(int i=0;i<n;i++)
{
data[i]=a[i];
}
length=n;
}
template<class T>
void Seqlist<T>::Insert(T x,int i)
{
if(i>length+1||i<1)throw "插入位置错误";
if(length==MaxSize)throw "上溢";
for(int j=length;j>=i;j--)
{
data[j]=data[j-1];
}
data[i-1]=x;
length++;
}
template<class T>
T Seqlist<T>::Delete(int i)
{
T x;
if(i>length||i<1)throw "删除位置错误";
if(length==0)throw "下溢";
x=data[i-1];
for(int j=i;j<length;j++)
{
data[j-1]=data[j];
}
length--;
return x;
}
//按位查找
template<class T>
T Seqlist<T>::Get(int i)
{
if(i>length+1||i<1)throw "查找位置非法";
else return data[i-1];
}
//按值查找
template<class T>
int Seqlist<T>::Locate(T x)
{
for(int i=0;i<length;i++)
{
if(data[i]==x)
return i+1;
}
return 0;
}
//按值删除
template<class T>
void Seqlist<T>::Delete_All(T x)
{
while(Locate(x)!=0)
{
Delete(Locate(x));
}
cout<<"结束"<<endl;
}
template<class T>
void Seqlist<T>::Disply()
{
for(int i=0;i<length;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;
}
template<class T>
int Seqlist<T>::Length()
{
return length;
}
int main()
{
int p[7]={1,2,2,2,3,4,5},x,y,z,m,k,g,h;
Seqlist<int> L(p,7);
cout<<"当前线性表的数据为:"<<endl;
L.Disply();
try
{
cout<<"请输入插入元素的值和位置 ";
cin>>g;
cin>>h;
L.Insert(g,h);
cout<<"执行插入操作后的数据为:"<<endl;
L.Disply();
}catch(const char *str){cout<<str<<endl;}
cout<<"当前线性表长度为:"<<L.Length()<<endl;
cout<<"请输入查询的元素值(按值查找元素位置): ";
cin>>x;
m=L.Locate(x);
if(m==0){cout<<"查找失败!"<<endl;}
else {cout<<"元素"<<x<<"的位置为:"<<m<<endl;}
try
{
cout<<"请输入查找第几个元素的值(按元素位置查找值): ";
cin>>y;
int w;
w=L.Get(y);
cout<<"第"<<y<<"个元素的位置为:"<<w<<endl;
}catch(const char *str){cout<<str<<endl;}
try
{
cout<<"请输入要删除第几个元素: ";
cin>>z;
k=L.Delete(z);
cout<<"删除的元素是"<<k<<"删除后数据为:"<<endl;
L.Disply();
}catch(const char *str){cout<<str<<endl;}
cout<<"请输入要删除的元素值: ";
cin>>z;
L.Delete_All(z);
L.Disply();
return 0;
}
单链表
#include<iostream>
using namespace std;
template<class T>
struct Node
{
T data;
Node<T> *next;
};
template<class T>
class LinkList
{
public:
LinkList();
LinkList(T a[],int n);
~LinkList();
int Length();
T Get(int i);
int Locate(T x);
void Insert(int i,T x);
void Valueinsert(T x,T y);
T Delete(int i);
int Valuedelete(T x);
int Empty();
void Printlist();
private:
Node<T> *first;
};
template<class T>
LinkList<T>::LinkList()
{
first=new Node<T>;
first->next=NULL;
}
//头插法
/*
template<class T>
LinkList<T>::LinkList(T a[],int n)
{
first=new Node<T>;
first->next=NULL;
for(int i=0;i<n;i++)
{
Node<T> *s=NULL;
s=new Node<T>;
s->data=a[i];
s->next=first->next;
first->next=s;
}
}
*/
//尾插法
template<class T>
LinkList<T>::LinkList(T a[],int n)
{
first=new Node<T>;
Node<T> *r=first,*s=NULL;
for(int i=0;i<n;i++)
{
s=new Node<T>;
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
template<class T>
void LinkList<T>::Printlist()
{
Node<T> *p=first->next;
while(p!=NULL)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}
template<class T>
int LinkList<T>::Length()
{
Node<T> *p=first->next;
int count=0;
while(p!=NULL)
{
p=p->next;
count++;
}
return count;
}
//按位查找
template<class T>
T LinkList<T>::Get(int i)
{
Node<T> *p=first->next;
int count=1;
while(p!=NULL&&count<i)
{
p=p->next;
count++;
}
if(p==NULL) throw "查找位置错误";
else return p->data;
}
//按位查找
template<class T>
int LinkList<T>::Locate(T x)
{
Node<T> *p=first->next;
int count=1;
while(p!=NULL)
{
if(p->data==x)
{
return count;
}
p=p->next;
count++;
}
return 0;
}
//在值为X的结点后,插入一个结点
template<class T>
void LinkList<T>::Valueinsert(T x,T y)
{
Node<T> *p=first->next,*s=NULL;
while(p!=NULL&&p->data!=x)
{
p=p->next;
}
if(p==NULL) throw "插入值错误";
else
{
s=new Node<T>;
s->data=y;
s->next=p->next;
p->next=s;
}
}
//在某个位置后,插入值为X的结点
template<class T>
void LinkList<T>::Insert(int i,T x)
{
Node<T> *p=first,*s=NULL;
int count=0;
while(p!=NULL&&count<i-1)
{
p=p->next;
count++;
}
if(p==NULL) throw "插入位置错误";
else{
s=new Node<T>;
s->data=x;
s->next=p->next;
p->next=s;
}
}
//删除某个位置上的结点
template<class T>
T LinkList<T>::Delete(int i)
{
T x;
Node<T> *p=first,*q=NULL;
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;
}
}
//删除值为X的结点
template<class T>
int LinkList<T>::Valuedelete(T x)
{
Node<T> *p=first->next,*q=NULL,*s=first;
int count=1;
while(p!=NULL&&p->data!=x)
{
s=s->next;
p=p->next;
count++;
}
if(p==NULL)
{
throw "删除值错误";
}
else
{
s->next=p->next;
delete q;
return count;
}
return 0;
}
template<class T>
LinkList<T>::~LinkList()
{
Node<T> *p=first;
while(p!=NULL)
{
first=first->next;
delete p;
p=first;
}
}
int main()
{
int p[5]={1,2,3,4,5},x,y,z,m,k,g,h;
LinkList<int> L(p,5);
cout<<"当前线性表的数据为:"<<endl;
L.Printlist();
try
{
cout<<"请输入插入元素的位置和值: ";
cin>>g;
cin>>h;
L.Insert(g,h);
cout<<"执行插入操作后的数据为:"<<endl;
L.Printlist();
}catch(const char *str){cout<<str<<endl;}
try
{
cout<<"请输入在某个值后插入,并输入要插入的值: ";
cin>>g;
cin>>h;
L.Valueinsert(g,h);
cout<<"执行插入操作后的数据为:"<<endl;
L.Printlist();
}catch(const char *str){cout<<str<<endl;}
cout<<"当前线性表长度为:"<<L.Length()<<endl;
cout<<"请输入查询的元素值(按值查找元素位置): ";
cin>>x;
m=L.Locate(x);
if(m==0){cout<<"查找失败!"<<endl;}
else {cout<<"元素"<<x<<"的位置为:"<<m<<endl;}
try
{
cout<<"请输入查找第几个元素的值(按元素位置查找值): ";
cin>>y;
int w;
w=L.Get(y);
cout<<"第"<<y<<"个元素的位置为:"<<w<<endl;
}catch(const char *str){cout<<str<<endl;}
try
{
cout<<"请输入要删除第几个元素: ";
cin>>z;
k=L.Delete(z);
cout<<"删除的元素是"<<k<<"删除后数据为:"<<endl;
L.Printlist();
}catch(const char *str){cout<<str<<endl;}
try
{
cout<<"请输入要删除元素的值: ";
cin>>z;
k=L.Valuedelete(z);
cout<<"删除的元素位置是"<<k<<"删除后数据为:"<<endl;
L.Printlist();
}catch(const char *str){cout<<str<<endl;}
return 0;
}