实验一
线性表是最常见和常用的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 <iostream>
#include <algorithm>
const int maxn =1e3+5;
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n;
int a[n+maxn];
for(int i=1;i<=n;i++){
cin>>a[i];
}
cout<<"A is created as:";
for(int i=1;i<=n;i++){
cout<<" "<<a[i];
}
cout<<'\n';
int dis,number;
cin>>dis>>number;
for(int i=n+1;i>=dis+1;i--){
a[i]=a[i-1];
}
a[dis]=number;
cout<<"After inserted A is";
for(int i=1;i<=n+1;i++){
cout<<" "<<a[i];
}
cout<<'\n';
int deletenumber,distance;
cin>>deletenumber;
for(int i=1;i<=n+1;i++){
if(deletenumber==a[i]){
distance=i;
break;
}
}
for(int i=distance;i<=n+1;i++){
a[i]=a[i+1];
}
cout<<"After deleted A is";
for(int i=1;i<=n;i++){
cout<<" "<<a[i];
}
cout<<'\n';
int find1,find2,flag=0,di;
cin>>find1;
for(int i=1;i<=n;i++){
if(find1==a[i]){
flag=1;
di=i;
break;
}
}
if(flag)cout<<find1<<" is located at index of "<<di<<endl;
else cout<<find1<<" is not found"<<endl;
cin>>find2;
flag=0;
for(int i=1;i<=n;i++){
if(find2==a[i]){
flag=1;
di=i;
break;
}
}
if(flag)cout<<find2<<" is located at index of "<<di<<endl;
else cout<<find2<<" is not found"<<endl;
cin>>m;
int b[m+maxn];
for(int i=1;i<=m;i++){
cin>>b[i];
}
cout<<"B is created as:";
for(int i=1;i<=m;i++){
cout<<" "<<b[i];
}
cout<<'\n';
cout<<"A cross B is";
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i]==b[j])cout<<" "<<a[i];
}
}
cout<<'\n';
cout<<"A union B is";
for(int i=1;i<=n;i++){
cout<<" "<<a[i];
}
for(int i=1;i<=m;i++){
int f=0;
for(int j=1;j<=n;j++){
if(b[i]==a[j])f=1;
}
if(!f)cout<<" "<<b[i];
}
int c[maxn],count=1;
for(int i=1;i<=n;i++){
c[count]=a[i];
count++;
}
for(int i=1;i<=m;i++){
int g=0;
for(int j=1;j<=n;j++){
if(a[j]==b[i])g=1;
}
if(!g) {
c[count] = b[i];
count++;
}
}
cout<<'\n';
count--;
cout<<"A union B in sequence is";
sort(c+1,c+count+1);
for(int i=1;i<=count;i++){
cout<<" "<<c[i];
}
cout<<'\n';
return 0;
}
我在这里用了输入输出优化,因为我把not写成了nod,检查不出来,最后问了ACM大佬他告诉我可以这样,死马当活马医,为了兼容把cout<<endl;都改成了cout<<’\n’;,否则会报错
线性表是最常见和常用的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 <iostream>
#include <algorithm>
const int maxn =1e3+5;
using namespace std;
int main() {
ios::sync_with_stdio(false);
int n=1,m,sum;
cin>>sum;
//cout<<sum<<endl;
int a[maxn];
while(1){
int w;
cin>>w;
//cout<<w<<endl;
if(w != sum)
a[n]=w;
else break;
n++;
}
n--;
//for(int i=1;i<=n;i++){
// cin>>a[i];
//}
cout<<"A is created as:";
for(int i=1;i<=n;i++){
cout<<" "<<a[i];
}
cout<<'\n';
int dis,number;
cin>>dis>>number;
for(int i=n+1;i>=dis+1;i--){
a[i]=a[i-1];
}
a[dis]=number;
cout<<"After inserted A is";
for(int i=1;i<=n+1;i++){
cout<<" "<<a[i];
}
cout<<'\n';
int deletenumber,distance;
cin>>deletenumber;
for(int i=1;i<=n+1;i++){
if(deletenumber==a[i]){
distance=i;
break;
}
}
for(int i=distance;i<=n+1;i++){
a[i]=a[i+1];
}
cout<<"After deleted A is";
for(int i=1;i<=n;i++){
cout<<" "<<a[i];
}
cout<<'\n';
int find1,find2,flag=0,di;
cin>>find1;
for(int i=1;i<=n;i++){
if(find1==a[i]){
flag=1;
di=i;
break;
}
}
if(flag)cout<<find1<<" is located at index of "<<di<<endl;
else cout<<find1<<" is not found"<<endl;
cin>>find2;
flag=0;
for(int i=1;i<=n;i++){
if(find2==a[i]){
flag=1;
di=i;
break;
}
}
if(flag)cout<<find2<<" is located at index of "<<di<<endl;
else cout<<find2<<" is not found"<<endl;
int q;
m=1;
cin>>q;
int b[maxn];
while(1){
int w;
cin>>w;
if(w!=q)
b[m]=w;
else
break;
m++;
}
m--;
//for(int i=1;i<=m;i++){
// cin>>b[i];
//}
cout<<"B is created as:";
for(int i=1;i<=m;i++){
cout<<" "<<b[i];
}
cout<<'\n';
cout<<"A cross B is";
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i]==b[j])cout<<" "<<a[i];
}
}
cout<<'\n';
cout<<"A union B is";
for(int i=1;i<=n;i++){
cout<<" "<<a[i];
}
for(int i=1;i<=m;i++){
int f=0;
for(int j=1;j<=n;j++){
if(b[i]==a[j])f=1;
}
if(!f)cout<<" "<<b[i];
}
int c[maxn],count=1;
for(int i=1;i<=n;i++){
c[count]=a[i];
count++;
}
for(int i=1;i<=m;i++){
int g=0;
for(int j=1;j<=n;j++){
if(a[j]==b[i])g=1;
}
if(!g) {
c[count] = b[i];
count++;
}
}
cout<<'\n';
count--;
cout<<"A union B in sequence is";
sort(c+1,c+count+1);
for(int i=1;i<=count;i++){
cout<<" "<<c[i];
}
cout<<'\n';
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 <iostream>
#include <algorithm>
const int maxn =1e3+5;
using namespace std;
int main() {
ios::sync_with_stdio(false);
int n,m;
cin>>n;
int a[maxn],b[maxn];
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>b[i];
}
int count=n+1;
for(int i=1;i<=m;i++){
int flag=0;
for(int j=1;j<=n;j++){
if(b[i]==a[j]){
flag=1;
}
}
if(!flag){
a[count]=b[i];
count++;
}
}
count--;
sort(a+1,a+count+1);
for(int i=1;i<=count;i++){
cout<<a[i]<<endl;
}
return 0;
}