线性表的应用

问题描述:

 

线性表的合并:假设利用两个线性表La和Lb分别表示两个集合A和B,现要求一个新的集合A =A\cup B

有序表的合并:已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列

线性表的合并:

算法步骤:依次取出Lb中的每个元素,执行以下操作:

1、在La中查找该元素

2、查找不到,插入La的表尾

//伪代码
void union(List &La, List Lb){
    La_len = ListLength(La);
    Lb_len = ListLength(Lb);
    for(i = 1; i <= Lb_len;i++){
        GetElem(Lb,i,e);
        if(!LocateElem(La,e))
            Listlnsert(&La,++La_len,e);
    }
}

有序表的合并:

 算法步骤:

1、创建一个空表Lc

2、依次从La或Lb中选取元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止

3、继续将La或Lb其中一个表的剩余结点插入在Lc表的最后

顺序表实现:

借助两个指针pa和pb分别指向两个有序表La的首元素,Lb的首元素。比较两个指针所指元素大小,将小的值赋给Lc,该处指针向后移动,继续比较。

//伪代码
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
    pa = La.elem;
    pb = Lb.elem;//指针pa和pb的初值分别指向两个表的第一个元素
    Lc.length = La.length + Lb.length//新表长度为两个表长度之和
    Lc.elme = new ElemType[Lc.length]//为合并的新表分配数组空间
    pc = Lc.elem;//pc指向新表的第一个元素
    pa_last = La.elem+La.length-1//指向La表最后一个元素,为了判断是否表读完
    pb_last = Lb.elem+Lb.length-1//指向Lb表最后一个元素,为了判断是否表读完
    while(pa<=pa_last&&pb<=pb_last){//两个表都不为空
        if(*pa<=*pb)*pc++ = *pa++; //依次摘取两表中值较小的结点
            else *pc++ = *pb++;
    }
    while(pa<=pa_last)*pc++ = *pa++;//Lb表已到达表尾,将La中剩余元素加入Lc
    while(pb<=pb_last)*pc++ = *pb++;//La表已到达表尾,将Lb中剩余元素加入Lc
}
时间复杂度:O(ListLength(La)+ListLength(Lb))
空间复杂度:O(ListLength(La)+ListLength(Lb))

链表实现:假设用La的头结点作为Lc的头结点

//伪代码
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
    pa = La->next;
    pb = Lb->next;
    pc = Lc = La//用La的头结点作为Lc的头结点
    while(pa&&pb){
        if(pa->data<=pb->data){
            pc -> next = pa;
            pc = pa;
            pa = pa -> next;
        }
        else{
            pc -> next = pb;
            pc = pb;
            pb = pb -> next;
        }
    }
    pc ->next =(pa?pa:pb)//插入剩余段
    free(Lb);//释放Lb的头结点
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值