数据结构与算法实验一:线性表的基本操作 实现C++链表类+集合的并/交运算

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

猜你喜欢

转载自blog.csdn.net/Spidy_harker/article/details/105169386