线性表--算法设计题2.11

设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

算法:

Status Insert_Sqlist(SqList  & va, int  x)
{
     
int  i;
     
if (va.length + 1 > va.listsize)   return  ERROR;
     va.length
++ ;
     
for (i = va.length - 1 ; va.elem[i] > x && i >= 0 ; i -- )
       va.elem[i
+ 1 ] = va.elem[i];
     va.elem[i
+ 1 ] = x;
     
return  OK;

} 

 

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;
}

void  DestroyList(SqList  & L)
{
     free(L.elem);
     L.elem
= NULL;
     L.length
= 0 ;
     L.listsize
= 0 ;
}

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;
}

int  cmp( const   void * a, const   void * b)

     
return   * ( int * )a  -   * ( int * )b;
}

void  ListSort(SqList  & L)
{    
   qsort(L.elem,L.length,
sizeof ( int ),cmp);  
//将线性表按增序排列

    
}

Status Insert_Sqlist(SqList  & va, int  x)
{
     
int  i;
     
if (va.length + 1 > va.listsize)   return  ERROR;
     va.length
++ ;
     
for (i = va.length - 1 ; va.elem[i] > x && i >= 0 ; i -- )
       va.elem[i
+ 1 ] = va.elem[i];
     va.elem[i
+ 1 ] = x;
     
return  OK;
}

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;
     
int  i;
     
int  t = rand() % 100 ;  //随机生成待插入数
     printf(
" %d\n " ,t);
     InitList(La);
     
for (i = 1 ; i <= 5 ;i ++ )
        ListInsert(La,i,rand()
% 100 ); //随机生成5个数
     ListTraverse(La,print1);
     ListSort(La);
     ListTraverse(La,print1);
     Insert_Sqlist(La,t);
     ListTraverse(La,print1);
     
return   0 ;

} 

 代码下载/Files/cpoint/c-code.rar

转载于:https://www.cnblogs.com/cpoint/archive/2011/04/27/2030955.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值