6-9 两个非递减的有序链表合并 - 人邮DS(C 第2版)线性表习题2(2)

6-9 两个非递减的有序链表合并 - 人邮DS(C 第2版)线性表习题2(2)

作者 汪凌锋

单位 成都信息工程大学

将两个非递减的有序链表合并为一个非递减的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。链表合并后清空原链表。

函数接口定义:

void MergeList(LinkList const &la, LinkList const &lb, LinkList const &lc);

参数定义:
la - 被合并的链表一
lb - 被合并的链表二
lc - 合并后的新链表

裁判测试程序样例:

// Copyright [2023] <Water Wang>
#include <iostream>

enum Status {
    OK = 0, ERROR = -1, OVER_FLOW = -2
};

typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;  // LinkList is the pointer type which point to struct LNode

void InputDataAsLinkList(LinkList const &link_list);
void OutputDataInLinkList(LinkList const &link_list);
Status InitList(LinkList * link_list);
Status DestroyList(LinkList * link_list);
void MergeList(LinkList const &la, LinkList const &lb, LinkList const &lc);

int main() {
    LinkList la, lb, lc;

    InitList(&la);
    InitList(&lb);
    InitList(&lc);

    InputDataAsLinkList(la);
    InputDataAsLinkList(lb);
    MergeList(la, lb, lc);
    OutputDataInLinkList(la);
    OutputDataInLinkList(lb);
    OutputDataInLinkList(lc);

    DestroyList(&la);
    DestroyList(&lb);
    DestroyList(&lc);

    return 0;
}

/// @brief accept data from console, and store data in link list.
/// @param link_list link list which stores input data from console.
void InputDataAsLinkList(LinkList const &link_list) {
    using std::cin;
    cin >> link_list->data;
    LinkList temp_link_list = link_list;

    for (int i = 0; i < link_list->data; i++) {
        LNode * temp_lnode_ptr = new LNode;
        temp_lnode_ptr->next = NULL;
        cin >> temp_lnode_ptr->data;
        temp_link_list->next = temp_lnode_ptr;
        temp_link_list = temp_link_list->next;
    }

    return;
}

/// @brief output data in link list to console
/// @param link_list  link list which stores all input data from console.
void OutputDataInLinkList(LinkList const &link_list) {
    using std::cout;
    using std::endl;
    LinkList temp_link_list = link_list->next;

    cout << link_list->data << endl;

    while (NULL != temp_link_list) {
        if (NULL != temp_link_list->next) {
            cout << temp_link_list->data << " ";
        } else {
            cout << temp_link_list->data << endl;
        }

        temp_link_list = temp_link_list->next;
    }

    return;
}

/// @brief initiate link list.
/// @param link_list link list to be initiated.
Status InitList(LinkList *link_list) {
    Status result = ERROR;

    *link_list = new LNode;
    (*link_list)->data = 0;
    (*link_list)->next = NULL;
    result = OK;

    return result;
}

/// @brief destroy link list.
/// @param link_list link list to be destroyed.
Status DestroyList(LinkList * link_list) {
    while (NULL != (*link_list)) {
        LNode *p = *link_list;
        *link_list = (*link_list)->next;
        delete p;
    }

    return OK;
}

/// @brief merge two none decremental link lists as one none decremental link list.
///        clear the field data and next in link list head.
/// @param la 1st none decremental link list to be merged.
/// @param lb 2nd none decremental link list to be merged.
/// @param lc new none decremental link list.
/* 请在这里填写答案 */

输入样例:

输入两组长度不超过10的数组,每一组的第一行输入数组长度,第二行输入递增数组。例如:

5
20 50 60 90 150
7
2 30 60 60 80 160 180

输出样例:

输出链表合并后的两个空链表和新链表的长度及链表的各元素值,链表为空仅输出长度0。例如:

0
0
12
2 20 30 50 60 60 60 80 90 150 160 180

接口函数定义:

 

void MergeList(LinkList const &la, LinkList const &lb, LinkList const &lc) {
    LinkList pa = la->next;
    LinkList pb = lb->next;
    LinkList pc = 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;

    la->next = NULL;
    lb->next = NULL;
    la->data = 0;
    lb->data = 0;

    int cnt = 0;
    pc = lc->next;
    while (pc) {
        ++cnt;
        pc = pc->next;
    }
    lc->data = cnt;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新三晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值