算法之有序列表

(一)有序列表的合并算法

1.合并两个有序列表并且按升序排列——顺序表

void MergeList_Sq(SqList LA, SqList LB, SqList &LC) {
    pa = LA.elem                                // 定义两个pa、pb指针指向两个表的第一个元素
    pb = LB.elem
    LC.length = LA.length + LB.length           // 新表长度为带合并两表长度之和
    LC.elem = new ElemType[LC.length]           // 为合并后的新表分配一个数值空间
    pc = LC.elem                                // 指针pc指向新表的第一个元素
    pa_last = LA.elem + LA.length -1            // 指针pa_last指向LA表的最后一个元素
    pb_last = LB.elem + LB.length -1            // 指针pb_last指向LA表的最后一个元素
    while (pa <= pa_last && pb <= pb_last) {    // 在两个表都是非空的情况下
        if(*pa <= *pb) *pc++ = *pa++            // 判断较小的那个数值,将其存入LC中
            else *pc++ = *pb++
    }
    while (pa <= pa_last) *pc++ = *pa++         // 当其中一个表为空后,将另一个表剩余元素加入LC中
    while (pb <= pb_last) *pc++ = *pa++
}

2.合并两个有序列表并且按升序排列——链表

void MergeList_L(LinkList &La,linkList &Lb, linkList &LC) {
    pa = La->next 
    pb = Lb->next                        // 创建两个表的指针
    pc = Lc = La                         // 用La的头节点作为L从的头节点
    while (pa && pb) {                   // 在两个表都存在的时候
        if(pa->data <= pb->data){        // 判断链表数据域中的大小,将小的链表接入Lc中
        pc ->next = pa                   // 将pa接入Lc的next域,
        pc = pa                          // 移动Lc的指针pc 到 pa指针 指向结点
        pa = pa ->next                   // 取到下一个pa结点
        } else { 
        pc -> next = pb                  // 类似
        pc =pb
        pb = pb -> next
        }
    }
    pc ->next = pa? pa:pb                // 当某一个表为空后,将另一个表的剩余接入Lc后
    delete Lb
}
posted @   铜须的编程生活  阅读(132)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示