合并线性表:
Status list_union(Sqlistptr La,Sqlistptr Lb)
{
ElemType elem;
Status status;
int i,j,len=list_size(Lb);
for(i=1;i<=len;i++){
list_retrieve(Lb,i,&elem);
status=list_locate(La,elem,&j);
if(status!=success){
status=list_insert(La,1,elem);
if(status!=success)
break;
}
else
list_add(La,j,1);
}
return status;
}
时间复杂度:
list_size:顺序存储O(1),链式存储O(n)
list_retrieve:顺序存储O(1),链式存储O(n)
list_locate:顺序存储:O(n),链式存储:O(n)
list_insert:顺序存储:O(n),链式存储:O(n)
总体:顺序和链式都是O(n^2),但优先选择链式结构,因为实际开销链式更小。
顺序表合并:
Status list_union(listptr la,listptr lb)
{
Status s=success;
for(int i=1;i<=lb->length;i++){
for(int j=1;j<=l1->length;j++){
if(lb->elem[i]==la->elem[j])
break;
}
if(la->length<MAXSIZE){
if(j>la->length){
la->length++;
la->elem[length]=lb->elem[i];
}
}
else{
status=fail;
break;
}
return status;
}
有序表合并:(基于线性表基本操作)
Status list_merge(Sqlistptr la,Sqlistptr lb,Sqlistptr lc)
{
ElemType elem1,elem2;
status=list_init(lc);
int i=1,j=1,k=1;//i,j,k分别用于指示la,lb,lc中当前元素
int n=list_size(la);,m=list_size(lb);
while(i<=n&&j<=m){ //两个表都未处理完
list_retrieve(la,i,&elem1);
list_retrieve(lb,j,&elem2);
if(elem1<elem2){
status=list_insert(lc,k,elem1);
i+=1;
}
else{
status=list_insert(lc,k,elem2);
j+=1;
}
k+=1;
}
while(i<=n){ //表a未处理完
list_retrieve(la,i,&elem1);
status=list_insert(lc,k,elem1);
i+=1;
k+=1;
}
while(j<=m){ //表b未处理完
list_retrieve(lb,j,&elem2);
status=list_insert(lc,k,elem2);
j+=1;
k+=1;
}
return status;
}
有序表合并:(链式结构)
void merge(listptr *la,listptr *lb,listptr *lc)
{
listptr pa,pb,pc,tp;
pa=(*la)->next;
pb=(*lb)->next;
pc=*la;
while(!pa&&!pb){
if(pa->data<pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else if(pa->data>pb->data){
pc->next=pb;
pc=pb;
pb=pb->next;
}
else{
pc->next=pa;
pc=p-a;
pa=pa->next;
tp=pb;
pb=pb->next;
free(tp);
tp=NULL;
}
pc->next=(pa?pa:pb);
free(lb);
lc=la;
}
}