线性表是最常见和常用的ADT。假设线性表的元素为整数,请基于顺序存储结构实现线性表ADT。
基本功能包括:
(1)建立线性表;
输入有两行,第一行是一个整数n,线性表的长度; 第二行是n和数据元素
(2)插入:
输入两个整数,即元素插入的位置和元素值
(3)删除:
输入一个整数,即要删除的元素
(4)搜索:
输入一个整数,即搜索元素的值
(5)输出:
输出线性表的各个元素,空格分开。
(6)集合的并运算:
输入创建第二个集合(线性表),完成并运算
(7)集合的交运算:
输入创建第二个集合(线性表),完成交运算
(8)合并两个有序线性表:
两个有序线性表,合并后仍然有序
测试数据:
5 //线性表A的长度
1 3 5 7 9 //线性表A的数据
2 10 //表示在第2个位置插入10
10 //表示删除值=10的数据元素
9 //查找元素9
22 / /查找元素22
6 //线性表B的长度
1 2 3 4 5 6
例如:
输入 :
5
1 3 5 7 9
2 10
10
9
22
6
1 2 3 4 5 6
输出:
A is created as: 1 3 5 7 9
After inserted A is 1 10 3 5 7 9
After deleted A is 1 3 5 7 9
9 is located at index of 5
22 is not found
B is created as: 1 2 3 4 5 6
A cross B is 1 3 5
A union B is 1 3 5 7 9 2 4 6
A union B in sequence is 1 2 3 4 5 6 7 9
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
template<class T>
struct node
{
T x;
node<T>* nex,*pre;
node()
{
nex=NULL;
pre=NULL;
}
node(T a)
{
x=a;
pre=nex=NULL;
}
};
template<class T>
class Link
{
public:
node<T> *e,*head,*last;
int siz;
Link();
Link(const Link& L);
~Link();
void push_back(T val);
void build(int n,T a[]);
void Insert(int pos,T x);
void del(T x);
int Search(T x);
void print();
void deleteAll();
void Sort();
};
template <class T>
Link<T>::Link()
{
head = new node<T>;
last = new node<T>;
head->nex = last;
head->pre = NULL;
last->nex = NULL;
last->pre = head;
siz = 0;
}
template <class T>
Link<T>::Link(const Link &L)
{
head = new node<T>;
head->pre = NULL;
last = new node<T>;
head->nex = last;
last->pre = head;
siz = 0;
e = L.head;
while(e->nex != L.last)
{
e = e->nex;
last->x = e->x;
node<T> *p = new node<T>;
p->pre = last;
last->nex = p;
last = p;
siz++;
}
last->nex = NULL;
}
template <class T>
Link<T>::~Link()
{
if(siz == 0)
{
delete head;
delete last;
head = NULL;
last = NULL;
return;
}
while(head->nex != NULL)
{
node<T> *temp = head;
head = head->nex;
delete temp;
}
delete head;
head = NULL;
}
template <class T>
void Link<T>::push_back(T val)
{
node<T>* temp = this->last;
last->x = val;
last->nex = new node<T>;
node<T> *p = last;
last = last->nex;
last->pre = p;
last->nex = NULL;
siz++;
return;
}
template <class T>
void Link<T>::build(int n,T a[])
{
for(int i=1; i<=n; i++)
this->push_back(a[i]);
}
template <class T>
void Link<T>::Insert(int pos,T x)
{
if(pos>siz+1||!last)
{
cout<<"Insert Error"<<endl;
return;
}
siz++;
node<T> *l=head,*r=NULL;
for(int i=1; i<pos; i++)
l=l->nex;
r=l->nex;
if(r==last) push_back(x);///插入到末尾
else
{
e=new node<T>;
e->x=x;
l->nex=e,e->nex=r;
e->pre=l,r->pre=e;
}
}
template <class T>
void Link<T>::del(T x)
{
if(siz == 0) return ;
node<T> *p = head;
while(p->nex!=last)
{
p = p->nex;
if(p->x == x)
{
node<T> *temp = p->pre;
temp->nex = p->nex;
p->nex->pre = temp;
delete p;
siz--;
return ;
}
}
}
template <class T>
int Link<T>::Search(T x)
{
int index=0;
node<T>* p=head->nex;
while(p)
{
index++;
if(p->x==x)
return index;
p=p->nex;
}
return 0;
}
template <class T>
void Link<T>::print()
{
if(siz==0)
return;
node<T>* p=head->nex;
while(p!=last)
{
cout<<' '<<p->x;
p=p->nex;
}
cout<<endl;
}
template<class T>
void cross(Link<T>a,Link<T>b)
{
cout<<"A cross B is";
if(a.last==NULL||b.last==NULL)
{
if(a.last==NULL)
a.print();
if(b.last==NULL)
b.print();
}
node<T>* p=a.head->nex;
while(p!=a.last)
{
if(b.Search(p->x))
cout<<' '<<p->x;
p=p->nex;
}
cout<<'\n';
}
template<class T>
Link<T> Union(Link<T>a,Link<T>b)
{
Link<T> c=b,d=a;
node<T>* p=a.head->nex;
while(p!=a.last)
{
c.del(p->x);
p=p->nex;
}
node<T>* q=c.head->nex;
while(q!=c.last)
{
d.push_back(q->x);
q=q->nex;
}
return d;
}
template <typename T>
void Link<T>::Sort()
{
if(siz <= 1) return;
node<T> *p = head->nex;
for (int i = 0; i < siz-1; i++)
{
node<T> *q = p->nex;
for (int j = i+1; j < siz; j++)
{
if(p->x > q->x)
{
T temp = q->x;
q->x = p->x;
p->x = temp;
}
q=q->nex;
}
p = p->nex;
}
}
int main()
{
int n;
cin>>n;
int a[n+2];
for(int i=1; i<=n; i++)
cin>>a[i];
Link<int> l;
///1
l.build(n,a);
cout<<"A is created as:";
l.print();
///2
int pos,x;
cin>>pos>>x;
l.Insert(pos,x);
cout<<"After inserted A is";l.print();
///3
cin>>x;
l.del(x);
cout<<"After deleted A is";l.print();
///4
cin>>x;
pos=l.Search(x);
if(pos)
cout<<x<<" is located at index of "<<pos<<endl;
else
cout<<x<<" is not found"<<endl;
///5
cin>>x;
pos=l.Search(x);
if(pos)
cout<<x<<" is located at index of "<<pos<<endl;
else
cout<<x<<" is not found"<<endl;
///6
int m;
cin>>m;
int b[m+2];
for(int i=1;i<=m;i++) cin>>b[i];
Link<int> l2;
l2.build(m,b);
cout<<"B is created as:";l2.print();
///7
cross(l,l2);
///8
Link<int> l3=Union(l,l2);
cout<<"A union B is";l3.print();
///9
l3.Sort();
cout<<"A union B in sequence is";l3.print();
return 0;
}
/*
5
1 3 5 7 9
2 10
10
9
22
6
1 2 3 4 5 6
*/