有序表的应用

归并算法,将两个有序表合并成一个有序表,把LA和LB合并成一个新的有序表LC。

遍历LA和LB,比较大小,把其中较小的放入LC中,再对应的有序表指针向后移动一格。

顺序表结构实现

void UnionList(SqList * LA,SqList * LB,SqList * LC){
    int i = 0,j = 0,k = 0;
    while (i < LA -> length && j < LB -> length){
        if(LA -> data[i] > LB -> data[j]){
            LC -> data[k] = LB -> data[j];
            j++; k++;
        }
        else{
            LC -> data[k] = LA -> data[i];
            i++; k++;
        }
    }
    while (i < LA -> length){ //LA没有遍历完毕
        LC -> data[k] = LA -> data[i];
        i++; k++;
    }
    while (j < LB -> length){//LB没有遍历完毕
        LC -> data[k] = LB -> data[j];
        j++; k++;
    }

    LC -> length = k;

}

单链表实现

void UnionList1(LinkNode * LA,LinkNode * LB,LinkNode * LC){
    LinkNode *pa = LA -> next,*pb = LB -> next,*s,*r;
    r = LC;
    while (pa != NULL && pb != NULL){
        if(pa -> data < pb -> data){
            s = (LinkNode * ) malloc(sizeof(LinkNode));
            s -> data = pa -> data;
            r -> next = s; r = s;
            pa = pa -> next;
        }
        else{
            s = (LinkNode * ) malloc(sizeof(LinkNode));
            s -> data = pb -> data;
            r -> next = s; r = s;
            pb = pb -> next;
        }
    }
    while (pa != NULL){
        s = (LinkNode * ) malloc(sizeof(LinkNode));
        s -> data = pa -> data;
        r -> next = s; r = s;
        pa = pa -> next;
    }
    while (pb != NULL){
        s = (LinkNode * ) malloc(sizeof(LinkNode));
        s -> data = pb -> data;
        r -> next = s; r = s;
        pb = pb -> next;
    }
    r -> next = NULL;
}

找出A,B,C三个有序表的公共元素,并存储到A中,要求性能尽可能好,时间复杂度为O(m+n+p),其中m,n,p 为A,B,C的长度。

void Comnode(LinkNode * LA,LinkNode * LB,LinkNode * LC){
    LinkNode *pa = LA -> next,*pb = LB -> next,*pc = LC -> next,*r,*s;
   r = LA;
   r -> next = NULL;
    while (pa != NULL){
        while (pb != NULL && pa -> data > pb -> data)
            pb = pb -> next;
        while (pc != NULL && pa -> data > pc -> data)
            pc = pc -> next;
        if(pb != NULL && pc != NULL && pa -> data == pb -> data && pa -> data == pc -> data){
            r -> next = pa;
            r = pa;
            pa = pa -> next;
        }
        else{
            s = pa;
            pa = pa -> next;
            free(s);
        }
    }
    r -> next = NULL;
    LA = r;
}

删除一个有序单链表中重复的结点

void dels(LinkNode * L){
    LinkNode *p = L -> next,*q;
    while (p -> next != NULL){
        if(p -> data == p -> next -> data){
            q = p -> next;
            p -> next = q -> next; //直接指向下下个,跳过了下一个
            free(q);
        }
        else
            p = p -> next;
    }
}

合并两个顺序表并找出中位数,例如序列S1 = (11,13,15,17,19),S2 = (2,4,6,8,20),则S1和S2的中位数是11。要求在时间和空间都尽可能高效。

ElemType M_Search(SqList * A,SqList * B){ //A和B长度相同
    int i = 0,j = 0,k = 0;
    while (i < A -> length && j < B -> length){ //两个序列都没有扫描完毕
        k++; //归并的元素 +1
        if(A -> data[i] < B -> data[j]){
            if(k == A -> length){
                printf("中位数是:%d",A -> data[i]);
                return A -> data[i];
            }
            i++;
        }
        else{
            if(k == B -> length){
                printf("中位数是:%d",B -> data[i]);
                return B -> data[j];
            }
            j++;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值