线性表--算法设计题2.23

 设线性表A=(a1,a2……,am),B=(b1,b2……,bn),试写一个按下列规则合并A,B为线性表C的算法,即使得

 C=(a1,b1,……am,bm,……bn) 当m<=n时;

 C=(a1,b1,……an,bn,……am) 当m>n时; 

C code:

 #include<stdio.h>

#include < stdlib.h >
#define  LIST_INIT_SIZE 10
#define  LIST_INCREMENT 2
#define  ERROR 0
#define  OK 1
#define  OVERFLOW -1
#define  TRUE 1
typedef 
int  Status;

struct  SqList
{
     
int   * elem;
     
int  length;
     
int  listsize;
};

void  InitList(SqList  & L)
{
     L.elem
= ( int * )malloc(LIST_INIT_SIZE * sizeof ( int ));
     
if ( ! L.elem)
       exit(OVERFLOW);
     L.length
= 0 ;
     L.listsize
= LIST_INIT_SIZE;
}

Status ListInsert(SqList 
& L, int  i, int  e)
{
     
int   * newbase, * q, * p;
     
if (i < 1 || i > L.length + 1 )
       
return  ERROR;
     
if (L.length == L.listsize)
     {
          newbase
= ( int * )realloc(L.elem,(L.listsize + LIST_INCREMENT) * sizeof ( int ));
          
if ( ! newbase)
            exit(OVERFLOW);
          L.elem
= newbase;
          L.listsize
+= LIST_INCREMENT;
         
        }
        q
= L.elem + i - 1 ;
        
for (p = L.elem + L.length - 1 ; p >= q;  -- p)
          
* (p + 1 ) =* p;
        
* q = e;
        
++ L.length;
        
return  OK;
}

void  CreateList(SqList  & L, int  len)
{
     
int  i;
     
for (i = 1 ; i <= len; i ++ )
     {
          ListInsert(L,i,rand()
% 100 ); 
        }
}

void  CreateList_C(SqList La,SqList Lb,SqList  & Lc)
{
     
int  i,j;
     
if (Lc.listsize <= La.length + Lb.length)
     {
          Lc.listsize
+= La.length + Lb.length;
        }
     
for (i = 0 ,j = 1 ; j <= La.length + Lb.length  &&  i < La.length  &&  i < Lb.length; i ++ )
     {
          ListInsert(Lc,j,La.elem[i]);
          ListInsert(Lc,j
+ 1 ,Lb.elem[i]);
          j
+= 2 ;
        }
        
if (La.length < Lb.length)
        {
             
for (; i < Lb.length; i ++,j++ )
             {
                  ListInsert(Lc,j,Lb.elem[i]);
                }
        }
        
else
        {
             
for (; i < La.length; i ++,j++ )
             {
                  ListInsert(Lc,j,La.elem[i]);
                }
        }
}

void  ListTraverse(SqList L, void ( * vist)( int & ))
{
     
int   * p = L.elem;
     
int  i;
     
for (i = 1 ; i <= L.length; i ++ )
     {
          vist(
* p ++ );
        }
        printf(
" \n " );
}

void  print1( int   & c)
{
     printf(
" %d  " ,c);
}

int  main()
{
     SqList La,Lb,Lc;
     InitList(La);
     InitList(Lb);
     InitList(Lc);
     
int  La_len,Lb_len;
     printf(
" input length of La:  " );
     scanf(
" %d " , & La_len);
     printf(
" input length of Lb:  " );
     scanf(
" %d " , & Lb_len);
     CreateList(La,La_len);
     CreateList(Lb,Lb_len);
     printf(
" List a:  " );
     ListTraverse(La,print1);
     printf(
" List b:  " );
     ListTraverse(Lb,print1);
     CreateList_C(La,Lb,Lc);
     printf(
" List c:  " );
     ListTraverse(Lc,print1);
}

 

 

转载于:https://www.cnblogs.com/cpoint/archive/2011/04/28/2031299.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值