您的位置:首页 > 理论基础 > 数据结构算法

线性表的归并

2015-10-20 16:16 531 查看
已知LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列。例如,设

LA={3,5,8,11}
LB={2,6,8,9,11,15,20}


LC={2,3,5,6,8,8,9,11,11,15,20}
代码实现:
(1)顺序表
#include<stdio.h>
#include<malloc.h>
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{
int *elem;
int length;
int listsize;
}SqList;


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

int ListInsert_Sq(SqList &L,int i,int e){
if(i<1||i>L.length+1)
return ERROR;
if(L.length>=L.listsize){
int *newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
int *p,*q;
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 MergeList(SqList La,SqList Lb,SqList &Lc){
int *pa=La.elem;
int *pb=Lb.elem;
Lc.length=La.length+Lb.length;
Lc.listsize=Lc.length;
Lc.elem=(int *)malloc(Lc.listsize*sizeof(int));
int *pc=Lc.elem;
if(!Lc.elem)
exit(OVERFLOW);
int *pa_last=La.elem+La.length-1;
int *pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last){   //归并
if(*pa<=*pb){
*pc++=*pa++;
}else{
*pc++=*pb++;
}
}
while(pa<=pa_last){    //插入La的剩余元素
*pc++=*pa++;
}
while(pb<=pb_last){    //插入Lb的剩余元素
*pc++=*pb++;
}
}

int ListLength(SqList L){
return L.length;
}

int ListTraverse(SqList L){
int i;
for(i=0;i<L.length;i++){
printf("%d ",L.elem[i]);
}
printf("\n");
}

int main(){
SqList La,Lb,Lc;
//创建表La,La={3,5,8,11}
InitList_Sq(La);
ListInsert_Sq(La,1,3);
ListInsert_Sq(La,2,5);
ListInsert_Sq(La,3,8);
ListInsert_Sq(La,4,11);
printf("La:\n");
ListTraverse(La);
//创建表Lb,Lb={2,6,8,9,11,15,20}
InitList_Sq(Lb);
ListInsert_Sq(Lb,1,2);
ListInsert_Sq(Lb,2,6);
ListInsert_Sq(Lb,3,8);
ListInsert_Sq(Lb,4,9);
ListInsert_Sq(Lb,5,11);
ListInsert_Sq(Lb,6,15);
ListInsert_Sq(Lb,7,20);
printf("Lb:\n");
ListTraverse(Lb);
InitList_Sq(Lc);
MergeList(La,Lb,Lc);
printf("Lc:\n");
ListTraverse(Lc);
}


(2)单链表
#include<stdio.h>
#include<malloc.h>
#include<iostream>
#define OK 1
#define ERROR 0
typedef struct LNode{
int date;
struct LNode *next;
}LNode,*LinkList;

int CreatList_L(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}

int ListInsert_L(LinkList &L,int i,int e){
LinkList p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
LNode *s;
s=(LinkList)malloc(sizeof(LNode));
s->date=e;
s->next=p->next;
p->next=s;
return OK;
}

int MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){
LNode *pa=La->next;
LNode *pb=Lb->next;
LNode *pc=La;
Lc=pc;
while(pa&&pb){
if(pa->date<=pb->date){
pc->next=pa;
pc=pa;
pa=pa->next;
}else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
}

int ListLength(LinkList L){
int length=0;
LinkList p=L;
while(p!=NULL){
++length;
p=p->next;
}
return length;
}

int ListTraverse(LinkList L){
int length=ListLength(L);
for(int i=0;i<length-1;i++){
printf("%d ",L->next->date);
L=L->next;
}
printf("\n");
}

int main()
{
LinkList La,Lb,Lc;
CreatList_L(La);
ListInsert_L(La,1,3);
ListInsert_L(La,2,5);
ListInsert_L(La,3,8);
ListInsert_L(La,4,11);
printf("La:\n");
ListTraverse(La);
CreatList_L(Lb);
ListInsert_L(Lb,1,2);
ListInsert_L(Lb,2,6);
ListInsert_L(Lb,3,8);
ListInsert_L(Lb,4,9);
ListInsert_L(Lb,5,11);
ListInsert_L(Lb,6,15);
ListInsert_L(Lb,7,20);
printf("Lb:\n");
ListTraverse(Lb);
CreatList_L(Lc);
MergeList(La,Lb,Lc);
printf("Lc:\n");
ListTraverse(Lc);
}


---------------------结果预览-------------------

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息