zoukankan      html  css  js  c++  java
  • 线性表基本操作的实现(合并)

    //实现顺序表的建立、初始化、插入、删除、修改、普通合并、有序合并 
    #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、有序合并:

  • 相关阅读:
    idea配置web项目启动的详细说明
    mybatis如何防止sql注入(1)
    SQL基础(3)
    SQL基础(2)
    SQL基础(1)
    SpringMVC—对Ajax的处理(含 JSON 类型)(3)
    SpringMVC 之URL请求到Action的映射(1)
    Oracle 多表查询(2)
    Oracle 多表查询(1)
    mysql查询最近30天、7天、每天、昨天、上个月的记录
  • 原文地址:https://www.cnblogs.com/geziyu/p/9618080.html
Copyright © 2011-2022 走看看