重学数据结构之算法2.7

#include<stdio.h>  //输入输出函数头文件
#include<stdlib.h>  //内存申请函数头文件
#define LIST_INIT_SIZE  100
#define LISTINCREMENT  10
typedef int ElemType ;

typedef struct
{
    ElemType* elem ;                   //存储空间基址
    int length ;                       //当前长度
    int listsize ;                     //当前分配的存储容量(以sizeof(ElemType)为单位)

}Sqlist ;

//操作结构,构造一个空的线性表L
void InitList( Sqlist& L )
{
    //首先申请一定的空间
    L.elem = ( ElemType* ) malloc( LIST_INIT_SIZE * sizeof ( ElemType ) ) ;
    //判断是否申请成功
    if ( ! L.elem )
    {
        printf( "分配内存失败:\n " );
        exit ( -1 ) ;
    }
        
    //将此时线性表的大小初始化为0
    L.length = 0 ;
    //将此线性表的剩余空间置为最大
    L.listsize =  LIST_INIT_SIZE ;
}

//初始条件:线性表L已经存在
//操作结果,销毁线性表L


//初始条件:线性表L已经存在
//操作结果:将L重置为空表
void ClearList ( Sqlist& L)
{
    free ( L.elem ) ;
    InitList(L) ;

}

//初始条件:线性表L以存在
//操作结果:若L为空表,则返回TRUE,否则返回FALSE
int ListEmpty ( Sqlist L )
{
    if ( L.length == 0 )
        return 0 ;
    else
        return 1 ;

}

void DestroyList ( Sqlist& L )
{
    free ( L.elem ) ;

}

//初始条件:La和Lb都存在
//操作结果:将La和Lb中值,插入到Lc中
void MergeList( Sqlist& La , Sqlist& Lb , Sqlist& Lc )
{
    int la = 1 , lb2 = 1 , i = 1 ;
    //首先判断La和Lb是否为空
    if( !ListEmpty( La ))
    {
        if( !ListEmpty( Lb ))
        {
            printf( "两个线性表都为空:" ) ;
        }
        else
        {
            int lb = 1 ;
            for( ; lb <= Lb.length ; lb ++ )
            {
                Lc.elem[ lb ] = Lb.elem[ lb ] ;
                Lc.length ++ ;
            }
        }
    }
    else
    {
        
        while( ( la < La.length  ) && ( lb2 < Lb.length ) )
        {
            if( La.elem[ la ] > Lb.elem[ lb2 ] )
            {
                Lc.elem[ i ] = Lb.elem[ lb2 ] ;
                i ++ ;
                lb2 ++ ;
                Lc.length ++ ;
            }
            else
            {
                Lc.elem[ i ] = La.elem[ la ] ;
                i ++ ;
                la ++ ;
                Lc.length ++ ;
            }
        }
        while( la < La.length  )
        {
            Lc.elem[ i ] = La.elem[ la ] ;
            i ++ ;
            la ++ ;
            Lc.length ++ ;
        }
        while( lb2 < Lb.length  )
        {
            Lc.elem[ i ] = Lb.elem[ lb2 ] ;
            i ++ ;
            lb2 ++ ;
            Lc.length ++ ;
        }
    }
}




int main ()
{
    Sqlist M , N ,P ;
    InitList ( M ) ;
    InitList ( N ) ;
    InitList ( P ) ;
    for( M.length = 1 ; M.length < 10 ; M.length ++ )
    {
        M.elem [ M.length ] = M.length ;
    }
    for( N.length = 1 ; N.length < 10 ; N.length ++ )
    {
        N.elem [ N.length ] = N.length * 2 ;
    }
    MergeList( M , N , P ) ;
    int m = 1;
    for (   ; m < M.length ; m ++ )
    {
        printf("%d\n", M.elem[ m ])  ;
    }
    int n = 1;
    for (   ; n < N.length ; n ++ )
    {
        printf("%d\n", N.elem[ n ])  ;
    }
    int x = 1;
    for (   ; x <= P.length ; x ++ )
    {
        printf("%d\n", P.elem[ x ])  ;
    }
    ClearList ( M ) ;
    ClearList ( N ) ;
    ClearList ( P ) ;
    DestroyList ( M ) ;
    DestroyList ( N ) ;
    DestroyList ( P ) ;
        return 0 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值