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

#include
#include
#include
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"<         exit(0);//退出程序
    }
    L.length=0;//空表长度
    L.listsize=LIST_INIT_SIZE;//初始存储量
    cout<<"initialize success"< }
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 "<         exit(0);
    }
    if(L.length>=L.listsize)//增加分配空间
    {
        newbase=(int *)realloc((L.elem),(L.listsize+LISTINCREMENT)*sizeof(int ));
        if(!newbase)   //分配失败
        {
            cout<<"insert defeat"<             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 "< }
void ListDelete_Sq(SqList &L,int i )//删除i处的值
{
    int e;
    int *q,*p;
    if ((i<1)||(i>L.length))//i值不合法
    {
        cout<<"delete defeat"<         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 "<     }
}
void  ListRead_Sq(SqList &L,int i)//查看i处的值
{
    if ((i<1)||(i>L.length))//i值错误
        {
            cout<<"input locate error"<             exit(0);
        }
    cout< }
void ListShow_Sq(SqList &L)//输出表
{
    cout<<"------------------------------------------------------"<     int i=0;
    int  *q;
    for (q=L.elem;q         cout<     cout<<"------------------------------------------------------"< }
void ListInput_Sq(SqList &L)//输入表
{
    int i,e,amount;
    string way;
    cout<<"please choice assignment method(people or automate)"<     cin>>way;
    cout<<"please input how much number"<     cin>>amount;
    int *newbase;
    while(amount>L.listsize)//个数超出存储空间,增加空间量
    {
            newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
            if(!newbase)
            {
                cout<<"input error "<                 exit(0);
            }
            L.listsize=L.listsize+LISTINCREMENT;
    }
    srand((unsigned int)time(NULL));//随机种子
    int *q;
    q=L.elem;
    if(way=="people")//人工输入
    {
        for(i=0;i         {
            cin>>e;
            q[i]=e;
            ++L.length;
        }
    }
    else if(way=="automate")//自动输入
    {

        for(i=0;i         {
         q[i]=rand();
         ++L.length;
        }
    }
    else//指令不合法
    {
        cout<<"input error"<         exit(0);
    }
    cout<<"finish input"< }
void ListExtreme_Sq(SqList &L)//查找极值
{
int Max,Min,i=0;
int *q;
Max=Min=L.elem[i];//最值赋初值
for (q=L.elem;q {
    if(L.elem[i]>Max)//选最大值
        Max=L.elem[i];
    if(L.elem[i]         Min=L.elem[i];
}
cout<<"max:"< }
void ListFind_Sq(SqList &L,int e)//查找某个值
{
int *q;
for(q=L.elem;q     if(*q==e)
    {
        cout<<"there are it"<         q=q-1;
        break;
    }
if(q==L.elem+L.length)//查找失败
    cout<<"there are not it"< }
void ListSort_Sq(SqList &L)//排序
{
    int *q;
    q=L.elem;
    int i,j,k,n;
    n=L.length;
    for(i=0;i         for(j=i+1;j         {
            if(q[i]>q[j])
            {
                k=q[i];
                q[i]=q[j];
                q[j]=k;
            }
        }
    for(i=0;i     {
        if((q[i]>q[i+1]))
            break;
    }
    if(i==L.length-1)
        cout<<"sorting right"<     else
        cout<<"sorting error"<

}
void ListInvertion_Sq(SqList &L)//倒置
{
    int *q;
    int k,i=0;
    for(q=L.elem;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"<         exit(0);
    }
    int *q1,*q2,*q3;
    q1=L1.elem;
    q2=L2.elem;
    q3=L3.elem;
    int i=0,j=0,k=0;
    for(;i     {
        if(q1[i]>q2[j])
        {
            q3[k]=q2[j];
            j++;
        }
        else if(q1[i]         {
            q3[k]=q1[i];
            i++;
        }
        else if(q1[i]==q2[j])
        {
            q3[k]=q1[i];
            i++;
            j++;
        }cout<     }
    while(i     {
            q3[k]=q1[i];
            k++;
            i++;
    }
    while(j     {
        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"<     ListShow_Sq(n1);//输出n1
    ListInput_Sq(n2);//输入n2值
    cout<<"n2"<     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"<     ListShow_Sq(n1);//输出n1
    ListSort_Sq(n2);//对n2排序
    cout<<"n2"<     ListShow_Sq(n2);//输出n2
    ListInvertion_Sq(n1);//倒置n1
    cout<<"n1 invertion"<     ListShow_Sq(n1);//输出倒置后的n1
    ListInvertion_Sq(n1);//还原n1
    cout<<"n3"<     ListMerge_Sq(n1,n2,n3);//合并与输出n3
return 0;
}
 

你可能感兴趣的:(数据结构,数据结构,C++)