线性表是最常见和常用的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
#include
class SeqList{
protected:
int len;
int a[100];
public:
SeqList(){len = 0;}
SeqList(int n){len = n;}
SeqList(int n,int b[]){
len = n;
for (int i=0;i<n;++i) a[i] = b[i];
print();
};
void insert(int pos,int num){
len++,pos--;
for (int i=len-1;i>pos;--i) a[i] = a[i-1];
a[pos] = num;
print();
};
void Delect(int num){
for (int i=0;i<len;++i){
if (a[i] == num){
len--;
for (int j=i;j<len;++j) a[j] = a[j+1];
break;
}
}
print();
};
void Search(int num){
int yes = 0;
for (int i=0;i<len;++i){
if (a[i] == num){
yes = 1;
std::cout<<num<<" is located at index of "<<i+1<<std::endl;
break;
}
}
if (!yes) std::cout<<num<<" is not found"<<std::endl;
};
void print(){
for (int i=0;i<len;++i) std::cout<<" "<<a[i];
std::cout<<std::endl;
};
void cross(SeqList &x){
int vis[100],b[200],tot=0;
memset(vis,0, sizeof(vis));
for (int i=0;i<len;++i) vis[a[i]] = 1;
for (int i=0;i<len;++i) if (vis[x.a[i]]) b[tot++] = x.a[i];
for (int i=0;i<tot;++i) std::cout<<" "<<b[i];
std::cout<<std::endl;
};
void Union(SeqList &x){
int vis[100],b[200],tot=0;
memset(vis,0, sizeof(vis));
for (int i=0;i<len;++i) if (!vis[a[i]]) vis[a[i]] = 1,b[tot++] = a[i];
for (int i=0;i<x.len;++i) if (!vis[x.a[i]]) vis[x.a[i]] = 1,b[tot++] = x.a[i];
for (int i=0;i<tot;++i) std::cout<<" "<<b[i];
std::cout<<std::endl;
};
void merge(SeqList &x){
int vis[100],b[200],tot=0;
memset(vis,0, sizeof(vis));
for (int i=0;i<len;++i) if (!vis[a[i]]) vis[a[i]] = 1,b[tot++] = a[i];
for (int i=0;i<x.len;++i) if (!vis[x.a[i]]) vis[x.a[i]] = 1,b[tot++] = x.a[i];
std::sort(b,b+tot);
for (int i=0;i<tot;++i) std::cout<<" "<<b[i];
std::cout<<std::endl;
};
};
int main (){
int a[100],n,x,y;
std::cin>>n;
for (int i=0;i<n;++i) std::cin>>a[i];
std::cout<<"A is created as:";
SeqList A(n,a);
std::cin>>x>>y;
std::cout<<"After inserted A is";
A.insert(x,y);
std::cin>>x;
std::cout<<"After deleted A is";
A.Delect(x);
std::cin>>x;
A.Search(x);
std::cin>>x;
A.Search(x);
std::cin>>n;
for (int i=0;i<n;++i) std::cin>>a[i];
std::cout<<"B is created as:";
SeqList B(n,a);
std::cout<<"A cross B is";
A.cross(B);
std::cout<<"A union B is";
A.Union(B);
std::cout<<"A union B in sequence is";
A.merge(B);
return 0;
}
这里是引用线性表是最常见和常用的ADT。假设线性表的元素为整数,请基于单链式存储结构实现线性表ADT。
基本功能包括:
(1)建立线性表;
输入有两行:第一行一个整数,是输入元素的结束标志,例如0,则在输入结束时输入0,就表示输入结束了。
第二行是线性表的各个元素,最后一个是结束标志。
(2)插入:
输入两个整数,即元素插入的位置和元素值
(3)删除:
输入一个整数,即要删除的元素值
(4)搜索:
输入一个整数,即要搜索元素的值
(5)输出:
输出线性表的各个元素,空格分开。
(6)集合的并运算:
输入创建第二个集合(线性表),完成并运算
(7)集合的交运算:
输入创建第二个集合(线性表),完成交运算
(8)合并两个有序线性表:
两个有序线性表,合并后仍然有序
测试数据:
测试样例:
0 //线性表输入结束标志
1 3 5 7 9 0 //线性表A的各个元素,最后是结束标志
2 10 //表示在第2个位置插入10
10 //表示删除值=10的数据元素
9 //查找元素9
22 // 查找元素22
0 //线性表输入结束标志
1 2 3 4 5 6 0 //线性表B的各个元素,最后是结束标志
#include
class SeqList{
protected:
int len;
int a[100];
public:
SeqList(){len = 0;}
SeqList(int n){len = n;}
SeqList(int n,int b[]){
len = n;
for (int i=0;i<n;++i) a[i] = b[i];
print();
};
void insert(int pos,int num){
len++,pos--;
for (int i=len-1;i>pos;--i) a[i] = a[i-1];
a[pos] = num;
print();
};
void Delect(int num){
for (int i=0;i<len;++i){
if (a[i] == num){
len--;
for (int j=i;j<len;++j) a[j] = a[j+1];
break;
}
}
print();
};
void Search(int num){
int yes = 0;
for (int i=0;i<len;++i){
if (a[i] == num){
yes = 1;
std::cout<<num<<" is located at index of "<<i+1<<std::endl;
break;
}
}
if (!yes) std::cout<<num<<" is not found"<<std::endl;
};
void print(){
for (int i=0;i<len;++i) std::cout<<" "<<a[i];
std::cout<<std::endl;
};
void cross(SeqList &x){
int vis[100],b[200],tot=0;
memset(vis,0, sizeof(vis));
for (int i=0;i<len;++i) vis[a[i]] = 1;
for (int i=0;i<len;++i) if (vis[x.a[i]]) b[tot++] = x.a[i];
for (int i=0;i<tot;++i) std::cout<<" "<<b[i];
std::cout<<std::endl;
};
void Union(SeqList &x){
int vis[100],b[200],tot=0;
memset(vis,0, sizeof(vis));
for (int i=0;i<len;++i) if (!vis[a[i]]) vis[a[i]] = 1,b[tot++] = a[i];
for (int i=0;i<x.len;++i) if (!vis[x.a[i]]) vis[x.a[i]] = 1,b[tot++] = x.a[i];
for (int i=0;i<tot;++i) std::cout<<" "<<b[i];
std::cout<<std::endl;
};
void merge(SeqList &x){
int vis[100],b[200],tot=0;
memset(vis,0, sizeof(vis));
for (int i=0;i<len;++i) if (!vis[a[i]]) vis[a[i]] = 1,b[tot++] = a[i];
for (int i=0;i<x.len;++i) if (!vis[x.a[i]]) vis[x.a[i]] = 1,b[tot++] = x.a[i];
std::sort(b,b+tot);
for (int i=0;i<tot;++i) std::cout<<" "<<b[i];
std::cout<<std::endl;
};
};
int main (){
int a[100],n=0,x,y;
std::cin>>x;
while (1){
std::cin>>y;
if (y == x) break;
a[n++] = y;
}
std::cout<<"A is created as:";
SeqList A(n,a);
std::cin>>x>>y;
std::cout<<"After inserted A is";
A.insert(x,y);
std::cin>>x;
std::cout<<"After deleted A is";
A.Delect(x);
std::cin>>x;
A.Search(x);
std::cin>>x;
A.Search(x);
std::cin>>x;
n = 0;
while (1){
std::cin>>y;
if (y == x) break;
a[n++] = y;
}
std::cout<<"B is created as:";
SeqList B(n,a);
std::cout<<"A cross B is";
A.cross(B);
std::cout<<"A union B is";
A.Union(B);
std::cout<<"A union B in sequence is";
A.merge(B);
return 0;
}
实习目的:熟练掌握链表的建立及基本操作
问题描述:
1)实现链表的排序(升序)
2)实现两个有序链表的合并:A=A∪B,要求合并后仍然有序。
提交前请将所有的提示信息去掉,只保留最后的输出结果。例如运行时:从键盘直接输入:
2 1 2 3 1 2 3
输出结果为:
1 2 3
分别表示第一个链表元素个数为2,元素分别为 1,2 ;第二个链表元素个数为3,元素分别为1,2,3。
#include
class node{
public:
node *next;
int x;
};
class List{
protected:
node *head;
public:
List();
~List();
void CreateList(int n);
void merge(List &A);
};
List::List() {
head = new node;
head->x = 0;
head->next = NULL;
}
List::~List() {
delete head;
}
void List::CreateList(int n) {
node *a,*b;
b = head;
for (int i=0;i<n;++i){
a = new node;
std::cin>>a->x;
a->next = NULL;
b->next = a;
b = a;
}
}
void List::merge(List &A) {
int vis[100],b[100],tot=0;
memset(vis,0,sizeof vis);
node *p;
p = head;
while (p->next!= NULL){
p = p->next;
if (!vis[p->x]){
vis[p->x] = 1;
b[tot++] = p->x;
}
}
p = A.head;
while (p->next!= NULL){
p = p->next;
if (!vis[p->x]){
vis[p->x] = 1;
b[tot++] = p->x;
}
}
std::sort(b,b+tot);
for (int i=0;i<tot;++i) std::cout<<b[i]<<std::endl;
}
int main (){
int n;
std::cin>>n;
List A,B;
A.CreateList(n);
std::cin>>n;
B.CreateList(n);
A.merge(B);
return 0;
}