合并线性表(顺序存储)

//合并线性表(顺序存储)

#include <iostream>
using namespace std;
#include <windows.h>
#include <malloc.h>
#define LIST_INIT_SIZE 10
#define LIST_INCREATMENT 2
typedef int Elemtype;typedef struct SqList
{
    Elemtype * elem;
    int length;
    int size;
}SqList,*SqListPtr;typedef enum Status
{
    success,fail
}Status;
//***********************************************************************************************
//调试菜单 
void menu (); 
//线性表的初始化
Status List_Init(SqListPtr L);
//获得线性表的长度
int List_Size(SqListPtr L);
//录入
Status List_Input(SqListPtr L,Elemtype elem);
//插入
Status List_Insert(SqListPtr L,int pos,Elemtype elem);
//定位
Status Locate (SqListPtr L,Elemtype elem,int *pos);
//提取 
Status Retrival(SqListPtr L,int pos,Elemtype * elem);
//遍历
void List_Printf(SqListPtr L);
//***********************************************************************************************
//合并两个线性表 
Status List_Union(SqListPtr L1,SqListPtr L2);int main ()
{
    SqListPtr L1 = (SqListPtr)malloc(sizeof(SqList));
    SqListPtr L2 = (SqListPtr)malloc(sizeof(SqList));
    if(List_Init(L1) != success || List_Init(L2) != success)
        exit(1);
    List_Input(L1,1);
    List_Input(L2,2);
    List_Union(L1,L2);
    List_Printf(L2);
    /*******************************************************************************************
    
    //调试函数
     
    char Copy;
    SqListPtr L = (SqListPtr)malloc(sizeof(SqList));
    Elemtype elem;
    Elemtype * Elem = &elem;
    int pos;
    int * Pos = &pos;
    while(1)
    {
        menu ();
        cin>>Copy;
        system("cls");
        switch(Copy)
        {
            case 'A':
            case 'a':
                {
                    if(List_Init(L) == success)
                        puts("初始化成功");
                    else
                        puts("初始化失败"); 
                    break;
                }
            case 'B':
            case 'b':
                {
                    cout<<"线性表的长度为:"<<List_Size(L)<<endl; 
                    break;
                }
            case 'C':
            case 'c':
                {
                    puts("请输入 -- 数据 -- 位置");
                    cin>>elem>>pos; 
                    if(List_Insert(L,pos,elem) == success)
                        puts("插入成功");
                    else
                        puts("插入失败"); 
                    break;    
                }
            case 'D':
            case 'd':
                {
                    puts("请输入数据"); 
                    cin>>elem;
                    if(List_Input(L,elem) == success)
                        puts("录入成功");
                    else
                        puts("录入失败"); 
                    break;
                    
                }
            case 'E':
            case 'e':
                {
                    List_Printf(L);
                    break;
                }
            case 'F':
            case 'f':
                {
                    puts("请输入你要定位的数据");
                    cin>>elem; 
                if(Locate (L,elem,Pos) == success)
                    cout<<elem<<"是第"<<*Pos<<"个"<<endl;
                else
                    cout<<"该数据不存在"<<endl; 
                    break;
                }
            case 'G':
            case 'g':
                {
                    puts("请输入你要提取数据的序号");
                    cin>>pos; 
                    if(Retrival(L,pos,Elem) == success)
                        cout<<"该数据为:"<<*Elem<<endl;
                    else
                        cout<<"不存在"<<endl;
                    break;
                }    
        }
    }
    /*******************************************************************************/
    
    return 0;
}
//***************************************************************************************************
//菜单
void Menu ()
{
    
} //合并两个线性表 
Status List_Union(SqListPtr L1,SqListPtr L2)
{
    Status s = success;
    Elemtype  elem;
    int pos;
    
    int L1_Length = List_Size(L1);
    int i;
    for(i=0 ;i<L1_Length;i++)
    {
        if(Retrival(L1,i+1,&elem) != success)
            break;
        s = Locate(L2,elem,&pos);
        if(s!=success)
        {
            s = List_Insert(L2,1,elem);
            if(s != success)
                break;
        }
    }
    if(i == L1_Length)
    s = success;
    return s;
} //***************************************************************************************************
//********************************************************************************************************//调试菜单 
void menu ()
{
    puts("A 初始化线性表");
    puts("B 获得线性表的长度");
    puts("C 插入");
    puts("D 录入");
    puts("E 遍历");
    puts("F 定位");
    puts("G 提取");
}//线性表的初始化
Status List_Init(SqListPtr L)
{
    Status s = fail;
    L->size = LIST_INIT_SIZE;
    L->length = 0;
    L->elem = (Elemtype *)malloc(sizeof(Elemtype)*L->size);
    if(L->elem == NULL)
        return s;
    s = success;
    return s;
}//获得线性表的长度
int List_Size(SqListPtr L)
{
    return L->length;
} //插入
Status List_Insert(SqListPtr L,int pos,Elemtype elem)
{
    Status s = fail;
    if(pos<=0 || pos>L->length)
        return s;
    L->length++;
    if(L->length >=L->size)
    {
        Elemtype * p = L->elem;
        L->size+=LIST_INCREATMENT;
        L->elem = (Elemtype *)malloc(sizeof(Elemtype)*L->size);
        if(L->elem == NULL)
            return s;
        for(int i = 0; i< L->length ; i++)
        {
            L->elem[i] = p[i];
        }
    }
    for(int i = L->length-2; i>=pos-1;i--)
    {
        L->elem[i+1] = L->elem[i]; 
    }
    L->elem[pos-1] = elem;
    s = success;
    return s;
}//录入
Status List_Input(SqListPtr L,Elemtype elem)
{
    Status s = fail;
    if(L->length >= L->size)
    {
        Elemtype * p = L->elem;
        L->size+=LIST_INCREATMENT;
        L->elem = (Elemtype *)malloc(sizeof(Elemtype)*L->size);
        if(L->elem = NULL)
            return s;
        for(int i = 0; i<L->length; i++)
        {
            L->elem[i] = p[i];
        }
    }
    L->elem[L->length] = elem;
    L->length++;
    s = success;
    return s;
}//定位
Status Locate (SqListPtr L,Elemtype elem,int *pos)
{
    Status s = fail;
    int i;
    for(i=0; i<L->length; i++)
    {
        if(L->elem[i] == elem)
        {
            s = success;
            break;    
        }
    }
    *pos = i+1;
    return s;
}//提取 
Status Retrival(SqListPtr L,int pos,Elemtype * elem)
{
    Status s = fail;
    if(pos<=0 || pos>L->length)
        return s;
    *elem = L->elem[pos-1];
    s = success;
    return s;
}//遍历
void List_Printf(SqListPtr L)
{
    for(int i = 0; i<L->length ;i++)
    {
        cout<<L->elem[i]<<"   ";
        if((i+1)%3==0)
            cout<<endl; 
    }
}
//********************************************************************************************************
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只学弱狗!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值