• 线性表基本操作的实现(合并)


    //实现顺序表的建立、初始化、插入、删除、修改、普通合并、有序合并 
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    using namespace std;
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    #define LIST_INIT_SIZE 100
    #define LISTINCREMENT 10
    typedef int ElemType;
    ElemType *newbase; 
    //顺序表结构描述
    typedef struct{ 
        ElemType *elem;    //基地址指针 
        int length;        //顺序表长度,数据元素个数 
        int ListSize;    //存储空间 
    }SqList;
    //顺序表初始化
    int InitSqList(SqList &L){
        L.elem=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);//分配存储空间 
        if(!L.elem)
            exit(OVERFLOW);//分配存储空间失败 
        L.length=0;            //初始长度为0 
        L.ListSize=LIST_INIT_SIZE;   //初始空间 
        return OK;
    }
    //创建顺序表
    void CreatSqList(SqList &L){
        int i,n;
        cout<<"请输入顺序表的元素个数:";
        cin>>n;
        for(i=0;i<n;i++){
            cout<<"请输入第 "<<(i+1)<<" 个元素:";
            cin>>L.elem[i];
            L.length++;
        }
    }
    //顺序表的显示
    void ShowSqList(SqList &L){
        cout<<endl;
        for(int i=0;i<L.length;i++)
            cout<<L.elem[i]<<" ";
        cout<<endl;
    } 
    //顺序表的插入
    int InsertSqList(SqList &L,int pos,ElemType elem){//在顺序表中的pos位置插入elem元素 
        if((pos-1)<0&&pos>L.length+1){//判断位置是否合法 
            cout<<"您所插入的位置不合法!"<<endl;
            return ERROR;
        }
        if(L.length>=L.ListSize){/* realloc可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。所以在代码中,我们必须将realloc返回的值,重新赋值给newbase*/
            newbase=(ElemType *)realloc(L.elem,(L.ListSize+LISTINCREMENT)*sizeof(ElemType));
            if(!newbase)
                exit(OVERFLOW);//内存分配失败
            L.elem=newbase;
            L.ListSize+=LISTINCREMENT; 
        }
        for(int i=L.length-1;i>=pos-1;i--){
            L.elem[i+1]=L.elem[i];
        }
        L.elem[pos-1]=elem;
        L.length++;//表长加1 
        return OK;
    }
    //顺序表的删除
    int DeleteSqList(SqList &L,int pos){//顺序表中删除pos位置的元素
        if(pos<1||pos>L.length){
            cout<<"删除的位置不合法!"<<endl;
            return ERROR; 
        }
        for(int i=pos-1;i<L.length;i++){
            L.elem[i]=L.elem[i+1];
        }
        L.length--;//表长减1 
        return OK; 
    } 
    //修改顺序表
    int UpdateSqList(SqList &L,int pos,ElemType elem){//在顺序表pos位置修改元素
        if(pos<1&&pos>L.length){
            cout<<"修改的位置不合法!"<<endl;
            return ERROR;
        } 
        L.elem[pos-1]=elem;
        return 0;
    }
    //顺序表的合并
    void CombineSqList(SqList &La,SqList &Lb){
        int i,j;
        for(i=0;i<Lb.length;i++){
            int cout=0;
            for(j=0;j<La.length;j++){
                if(La.elem[j]==Lb.elem[j])
                    cout++;
            }
            if(cout==0)
                La.elem[La.length++]=Lb.elem[i];
        }
    }
    //顺序表的有序合并,有序合并的前提,两个顺序表已经排序好的 
    void CombineSq(SqList &LA,SqList &LB,SqList &LC){//LA,LB是递增排序的
        ElemType *pa,*pb,*pc,*pa_last,*pb_last;
        LC.length=LA.length+LB.length;//新表的长度为两个表的长度之和
        LC.elem=new ElemType[LC.length];//分配空间
        //LC.elem=(ElemType *)malloc(LC.length*sizeof(ElemType));
        pc=LC.elem;//分别指向第一个元素
        pa=LA.elem;
        pb=LB.elem;
        pa_last=LA.elem+LA.length-1;//指向最后一个元素
        pb_last=LB.elem+LB.length-1;
        while((pa<=pa_last)&&(pb<=pb_last)){ 
            if(*pa<=*pb)
                *pc++=*pa++;//就行比较然后就行赋值
            else
                *pc++=*pb++;
        }
        while(pa<=pa_last)
            *pc++=*pa++;//把剩下的逐一插入
        while(pb<=pb_last)
            *pc++=*pb++;
    }
    int main(){
        SqList L;
        InitSqList(L);
        CreatSqList(L);
        ShowSqList(L);
        int num=0;
        cout<<endl<<"1、插入"<<endl;
        cout<<"2、删除"<<endl;
        cout<<"3、修改"<<endl;
        cout<<"4、顺序表普通合并"<<endl;
        cout<<"5、顺序表有序合并"<<endl<<endl; 
        cout<<"请选择需要进行的操作:";
        cin>>num;
        if(num<1||num>5){
            cout<<"你选择的操作不存在,请重新输入:";
            cin>>num;
        }
        switch(num){
            case 1:{
                int m,n; 
                cout<<"请输入你要插入的位置:";
                cin>>m;
                cout<<"请输入你要插入的元素:"; 
                cin>>n;
                InsertSqList(L,m,n);
                ShowSqList(L);
                break;
            }
            case 2:{
                int m;
                cout<<"请输入你要删除的位置:";
                cin>>m;
                DeleteSqList(L,m);
                ShowSqList(L); 
                break;
            }
            case 3:{
                int m,n;
                cout<<"请输入你要修改的位置:";
                cin>>m;
                cout<<"请输入你要修改的元素:";
                cin>>n;
                UpdateSqList(L,m,n);
                ShowSqList(L);
                break;
            }
            case 4:{
                SqList Lb;
                InitSqList(Lb);
                cout<<"请创建你要合并的顺序表Lb:"<<endl;
                int n;
                cout<<"请输入Lb的元素个数:";
                cin>>n;
                cout<<"你所输入的"<<n<<"个元素分别为:"; 
                for(int i=0;i<n;i++){
                    cin>>Lb.elem[i];
                    Lb.length++;
                }
                CombineSqList(L,Lb);
                cout<<"合并后:"; 
                ShowSqList(L);
                break;
            }
            case 5:{
                SqList Lb,Lc;
                InitSqList(Lb);
                InitSqList(Lc);
                cout<<"请创建你要合并的顺序表Lb:"<<endl;
                int n;
                cout<<"请输入Lb的元素个数:";
                cin>>n;
                cout<<"你所输入的"<<n<<"个元素分别为:"; 
                for(int i=0;i<n;i++){
                    cin>>Lb.elem[i];
                    Lb.length++;
                }
                CombineSq(L,Lb,Lc);
                cout<<"合并后:"; 
                ShowSqList(Lc);
                break;
            }
        }
        return 0;
    } 

    1、插入:

    2、删除:

    2、修改:

    3、普通合并:

    4、有序合并:

  • 相关阅读:
    hdu 4521 小明系列问题——小明序列(线段树 or DP)
    hdu 1115 Lifting the Stone
    hdu 5476 Explore Track of Point(2015上海网络赛)
    Codeforces 527C Glass Carving
    hdu 4414 Finding crosses
    LA 5135 Mining Your Own Business
    uva 11324 The Largest Clique
    hdu 4288 Coder
    PowerShell随笔3 ---别名
    PowerShell随笔2---初始命令
  • 原文地址:https://www.cnblogs.com/geziyu/p/9618080.html
Copyright © 2020-2023  润新知