《数据结构与算法》——表、栈和队列(线性表的应用)

合并线性表:

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;
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值