中国石油大学华东数据结构实验一

实验一

线性表是最常见和常用的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;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值