将两个递增有序表归并成一个递增有序表,因为有序表没有元素相等的情况,所以无需判断相等。
算法思想:通过a,b指针分别遍历有序表,比较a,b指针指向的元素,将值小的通过尾插法插入有序表c,并且移动两者指针位置。当a,b中任一有序表遍历完后跳出循环,将另一有序表所有元素插入有序表c即可
顺序表实现
#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
#define MaxSize 10
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
InitL(SqList *L){ //初始化顺序表
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
Create(SqList *L,int a[],int n){ //通过数组创建顺序表
int i;
for(i=0;i<n;i++){
L->data[i]=a[i];
L->length=n;
}
}
Disp(SqList L){
int i=0;
for(;i<L.length;i++){
printf("%d ",L.data[i]);
}
}
SqList * guibing(SqList LA,SqList LB){
SqList *LC;
LC=(SqList *)malloc(sizeof(SqList));
int i=0,j=0,k=0;
while(i<LA.length && j<LB.length){
if(LA.data[i]<LB.data[j]){
LC->data[k]=LA.data[i];
i++;k++;
}else {
LC->data[k]=LB.data[j];
j++;k++;
}
}
while(i<LA.length){
LC->data[k]=LA.data[i];
i++;k++;
}
while(j<LB.length){
LC->data[k]=LB.data[j];
j++;k++;
}
LC->length=k;
return LC;
}
int main()
{
int a[]={1,3,5};
int b[]={2,4,8,10};
SqList LA,LB,*LC;
InitL(&LA);
InitL(&LB);
Create(&LA,a,3);
Create(&LB,b,4);
Disp(LA);
Disp(LB);
LC=guibing(LA,LB);
Disp(*LC);
}
链表实现
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode;
LNode * Create(LNode *L,int a[]){
int i=0;
L=(LNode *)malloc(sizeof(LNode));
LNode *s,*r;
r=L;
for(;i<sizeof(a)/sizeof(int);i++){
s=(LNode *)malloc(sizeof(LNode)); //每次都要为新节点申请空间
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
return L;
}
LNode * gb(LNode *LA,LNode *LB){
LNode *ra,*rb,*rc,*LC,*s;
LC=(LNode *)malloc(sizeof(LNode));
LC->next=NULL;
ra=LA->next;
rb=LB->next;
rc=LC;
while(ra!=NULL && rb!=NULL){
if(ra->data < rb->data){
s=(LNode *)malloc(sizeof(LNode));
s->data=ra->data;
rc->next=s;
rc=s;
ra=ra->next;
} else
s=(LNode *)malloc(sizeof(LNode));
s->data=rb->data;
rc->next=s;
rc=s;
rb=rb->next;
}
while(ra!=NULL){
s=(LNode *)malloc(sizeof(LNode));
s->data=ra->data;
rc->next=s;
rc=s;
ra=ra->next;
}
while(rb!=NULL){
s=(LNode *)malloc(sizeof(LNode));
s->data=rb->data;
rc->next=s;
rc=s;
rb=rb->next;
}
return LC;
}
int main(){
LNode *LA,*LB,*LC;
int a[]={1,3,5};
int b[]={2,4,8,10};
LA=Create(LA,a);
LB=Create(LB,b);
LC=gb(LA,LB);
}