数据结构——顺序表的基本操作与合并两个顺序表

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define LIST_INIT_SIZE  100//表的初始空间分配量
#define LISTINCREMENT   10//表存储空间的增量
typedef struct
{
    int *elem;//首地址
    int length;//元素个数
    int listsize;//表空间大小
}SqList;
void InitList_Sq(SqList &L)//线性表初始化
{
    L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));//分配空间
    if(!L.elem)//存储分配失败
    {
        cout<<"don't create list"<<endl;
        exit(0);//退出程序
    }
    L.length=0;//空表长度
    L.listsize=LIST_INIT_SIZE;//初始存储量
    cout<<"initialize success"<<endl;//分配成功
}
void ListInsert_Sq(SqList &L,int i ,int e)//在顺序表L的滴i个位置插入元素e
{
    int * newbase,*q,*p;
    if (i<1||i>L.length +1)//位置i不符合规定
    {
        cout<<"insert defeat "<<endl;
        exit(0);
    }
    if(L.length>=L.listsize)//增加分配空间
    {
        newbase=(int *)realloc((L.elem),(L.listsize+LISTINCREMENT)*sizeof(int ));
        if(!newbase)   //分配失败
        {
            cout<<"insert defeat"<<endl;
            exit(0);
        }
        L.elem=newbase;//新基址
        L.listsize +=LISTINCREMENT;//增加存储量
    }
    q=&(L.elem[i-1]);//q为插入地址
    for(p=&(L.elem[L.length-1]);p>=q;--p)  //插入位置后方的元素右移
        *(p+1)=*p;
    q[i-1]=e;  //插入e
    ++L.length;//表长加1
    cout<<"insert "<<e<<"in"<<i<<endl;
}
void ListDelete_Sq(SqList &L,int i )//删除i处的值
{
    int e;
    int *q,*p;
    if ((i<1)||(i>L.length))//i值不合法
    {
        cout<<"delete defeat"<<endl;
        exit(0);
    }
    else
    {
        p=&(L.elem[i-1]);
        e=*p;//删除值
        q=L.elem+L.length-1;// p为删除元素
        for(++p;p<=q;++p)   //删除后左移
            *(p-1)=*p;
        --L.length;//表长减1
        cout<<"delete "<<e<<endl;
    }
}
void  ListRead_Sq(SqList &L,int i)//查看i处的值
{
    if ((i<1)||(i>L.length))//i值错误
        {
            cout<<"input locate error"<<endl;
            exit(0);
        }
    cout<<L.elem[i-1]<<endl;//输出该值
}
void ListShow_Sq(SqList &L)//输出表
{
    cout<<"------------------------------------------------------"<<endl;
    int i=0;
    int  *q;
    for (q=L.elem;q<L.elem+L.length;i++,q++)//逐一输出
        cout<<i+1<<":  "<<L.elem[i]<<endl;
    cout<<"------------------------------------------------------"<<endl;
}
void ListInput_Sq(SqList &L)//输入表
{
    int i,e,amount;
    string way;
    cout<<"please choice assignment method(people or automate)"<<endl;//选择人工或者自动输入
    cin>>way;
    cout<<"please input how much number"<<endl;//输入元素个数
    cin>>amount;
    int *newbase;
    while(amount>L.listsize)//个数超出存储空间,增加空间量
    {
            newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
            if(!newbase)
            {
                cout<<"input error "<<endl;
                exit(0);
            }
            L.listsize=L.listsize+LISTINCREMENT;
    }
    srand((unsigned int)time(NULL));//随机种子
    int *q;
    q=L.elem;
    if(way=="people")//人工输入
    {
        for(i=0;i<amount;i++)
        {
            cin>>e;
            q[i]=e;
            ++L.length;
        }
    }
    else if(way=="automate")//自动输入
    {

        for(i=0;i<amount;i++)
        {
         q[i]=rand();
         ++L.length;
        }
    }
    else//指令不合法
    {
        cout<<"input error"<<endl;
        exit(0);
    }
    cout<<"finish input"<<endl;//完成
}
void ListExtreme_Sq(SqList &L)//查找极值
{
int Max,Min,i=0;
int *q;
Max=Min=L.elem[i];//最值赋初值
for (q=L.elem;q<L.elem+L.length;i++,q++)
{
    if(L.elem[i]>Max)//选最大值
        Max=L.elem[i];
    if(L.elem[i]<Min)//选最小值
        Min=L.elem[i];
}
cout<<"max:"<<Max<<'\n'<<"min:"<<Min<<endl;
}
void ListFind_Sq(SqList &L,int e)//查找某个值
{
int *q;
for(q=L.elem;q<L.elem+L.length;q++)//遍历查找
    if(*q==e)
    {
        cout<<"there are it"<<endl;//找到
        q=q-1;
        break;
    }
if(q==L.elem+L.length)//查找失败
    cout<<"there are not it"<<endl;
}
void ListSort_Sq(SqList &L)//排序
{
    int *q;
    q=L.elem;
    int i,j,k,n;
    n=L.length;
    for(i=0;i<n;i++)//选择排序法
        for(j=i+1;j<n;j++)
        {
            if(q[i]>q[j])
            {
                k=q[i];
                q[i]=q[j];
                q[j]=k;
            }
        }
    for(i=0;i<L.length-1;i++)//检验排序是否正确
    {
        if((q[i]>q[i+1]))
            break;
    }
    if(i==L.length-1)
        cout<<"sorting right"<<endl;//正确
    else
        cout<<"sorting error"<<endl;//错误,

}
void ListInvertion_Sq(SqList &L)//倒置
{
    int *q;
    int k,i=0;
    for(q=L.elem;i<L.length/2;i++)//对称互换
        {
            k=q[i];
            q[i]=q[L.length-1-i];
            q[L.length-1-i]=k;
        }
}
void ListMerge_Sq(SqList &L1,SqList &L2,SqList &L3)//L1与L2合并为L3
{
    L3.listsize=L1.length+L2.length;//初始空间大小
    L3.elem=(int *)malloc(L3.listsize*sizeof(int));//创建表
    if(!L3.elem)//创建失败
    {
        cout<<"L3 hasn't create"<<endl;
        exit(0);
    }
    int *q1,*q2,*q3;
    q1=L1.elem;
    q2=L2.elem;
    q3=L3.elem;
    int i=0,j=0,k=0;
    for(;i<L1.length&&j<L2.length;k++)//两两比较 取大值放入L3直至一方终结
    {
        if(q1[i]>q2[j])
        {
            q3[k]=q2[j];
            j++;
        }
        else if(q1[i]<q2[j])
        {
            q3[k]=q1[i];
            i++;
        }
        else if(q1[i]==q2[j])
        {
            q3[k]=q1[i];
            i++;
            j++;
        }cout<<k;
    }
    while(i<L1.length)//将未放入L3的值放入
    {
            q3[k]=q1[i];
            k++;
            i++;
    }
    while(j<L2.length)
    {
        q3[k]=q2[j];
        k++;
        j++;
    }
    L3.length=k;

    ListShow_Sq(L3);
}
int main()
{
    SqList n1,n2,n3;//创建表n1.n2.n3
    InitList_Sq(n1);//初始化n1
    InitList_Sq(n2);//初始化n2
    InitList_Sq(n3);//初始化n3
    ListInput_Sq(n1);//输入n1值
    cout<<"n1"<<endl;
    ListShow_Sq(n1);//输出n1
    ListInput_Sq(n2);//输入n2值
    cout<<"n2"<<endl;
    ListShow_Sq(n2);//输出n2
    ListInsert_Sq(n1,1,2);//在位置1插入2
    ListShow_Sq(n1);//输出表n1
    ListDelete_Sq(n1,1);//删除位置i的值
    ListShow_Sq(n1);//输出表n1
    ListFind_Sq(n1,3);//在n1中寻找3
    ListExtreme_Sq(n1);//查看n1极值
    ListRead_Sq(n1,1);//查看表n1位置一的值
    ListSort_Sq(n1);//对n1排序
    cout<<"n1"<<endl;
    ListShow_Sq(n1);//输出n1
    ListSort_Sq(n2);//对n2排序
    cout<<"n2"<<endl;
    ListShow_Sq(n2);//输出n2
    ListInvertion_Sq(n1);//倒置n1
    cout<<"n1 invertion"<<endl;
    ListShow_Sq(n1);//输出倒置后的n1
    ListInvertion_Sq(n1);//还原n1
    cout<<"n3"<<endl;
    ListMerge_Sq(n1,n2,n3);//合并与输出n3
return 0;
}
 

猜你喜欢

转载自blog.csdn.net/hrainning/article/details/86367598