顺序表合并

      question:

             建立两个非递减顺序表A,B,合并为一个顺序表但不创建新的顺序表,相同数据不插入。比如:

             A:1 2 3 4 5

             B:2 7

             可把长度短的插入到长度长的顺序表中,即A:1 2 3 4 5 7

实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct {
  ElemType *elem;
  int length;
}SqList;  //结构体定义顺序表
Status InitList_Sq(SqList *L){
  L->elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
  //L.elem=new ElemType[MAXSIZE];  //为什么不能用new
  if(!L->elem) exit(OVERFLOW);
  L->length=0;
  return OK;
}   //顺序表的初始化函数
Status ListInsert_Sq(SqList *L,int i,ElemType e){
    int j;
  if(i<1||i>L->length+1) return ERROR;
  if(L->length==MAXSIZE) return ERROR;
  for(j=L->length-1;j>=i-1;j--){
    L->elem[j+1]=L->elem[j];
  }
  L->elem[i-1]=e;
  ++L->length;
  return OK;
}    // 插入函数
void ListDisplay(SqList *L){
  int i;
  for(i=0;i<=L->length-1;i++){
      if(i==L->length-1) printf("%d",L->elem[i]);
    else printf("%d ",L->elem[i]);
  }
}  //输出顺序表


int GetElem(SqList *L,int i){
  return L->elem[i-1];
}  //获取顺序表中第i个数据
void MergeList_Sq(SqList *LA,SqList *LB){
    int i,j,e,k;
    for(i=1;i<=LB->length;i++){
      e=GetElem(LB,i);
      k=0;
      for(j=0;j<LA->length;j++){
          if(LA->elem[j]==e) k++;
          }
      if(k==0){
        for (j=0;j<LA->length;j++){
          if(j==(LA->length-1)&&e>LA->elem[-1]) {ListInsert_Sq(LA,LA->length+1,e); break;}
          else if (e>LA->elem[j]&&e<LA->elem[j+1]) {ListInsert_Sq(LA,j+2,e); break;}
        }
      }
    }
}  //合并函数
void Input_Sq(SqList *L){
  int i;
  printf("输入元素:");
  for(i=0;i<L->length;i++){
    scanf("%d",&L->elem[i]);
  }
}  //顺序表输入数据函数
int main(){
    SqList A,B;
    int e,a,b,c;
    if(InitList_Sq(&A)) printf("A顺序表已建成!!\n");//调用初始化函数
    printf("请输入顺序表长 ");
    scanf("%d",&A.length);
    Input_Sq(&A);
    if(InitList_Sq(&B)) printf("B顺序表已建成!!\n");
    printf("请输入顺序表长 ");
    scanf("%d",&B.length);
    Input_Sq(&B);
    printf("输出顺序表A的元素:");
    ListDisplay(&A);
    printf("\n");
    printf("输出顺序表B的元素:");
    ListDisplay(&B);
    //比较长度合并
    if(A.length>=B.length){
    MergeList_Sq(&A,&B);
    printf("\n合并后:");
    ListDisplay(&A);
    printf("\n");
    }
    else {
    MergeList_Sq(&B,&A);
    printf("\n合并后:");
    ListDisplay(&B);
    printf("\n");
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值