数据结构-实验1:线性表基本操作

第一题

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

你可能感兴趣的:(数据结构作业)