任务描述
本关任务:已知两个单链表A和B,数据元素按值非递减有序排列,现将A和B归并成一个新的单链表C,使C中的数据元素仍按值非递减有序排列。 例如: 设 A=(3,5,8,11) B=(2,6,9,15,20) 则 C=(2,3,5,6,8,9,11,15,20)
相关知识
为了完成本关任务,你需要掌握:1. 单链表的类型定义,2.单链表涉及的主要操作。
单链表的类型定义
定义如下:
typedef int ElemType;//数据元素的类型为整数
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList; // LinkList为指向结构体LNode的指针类型
单链表涉及的主要操作
主要操作如下:
-
链表的初始化:构造一个带头结点的空的单链表。具体操作函数定义如下:
void LL_Initiate(LinkList &L)
-
释放链表:释放链表中各个结点。具体操作函数定义如下:
void LL_Free(LinkList &L)
-
判断链表是否为空: 若为空表,则返回
true
,否则返回false
。具体操作函数定义如下:bool LL_IsEmpty(LinkList L)
-
头插法创建链表: 输入
n
个数据元素,采用头插法,创建一个带头结点的单链表L
。具体操作函数定义如下:void LL_Create_H(LinkList &L,int n)
-
尾插法创建链表: 输入
n
个数据元素,采用尾插法,创建一个带头结点的单链表L
。具体操作函数定义如下:void LL_Create_R(LinkList &L,int n)
-
输出整个链表: 具体操作函数定义如下:
void LL_Print(LinkList L)
-
链表的合并: 已知单链表
LA
和LB
的元素按值非递减排列,归并LA
和LB
得到新的单链表LC
,LC
的元素也按值非递减排列。该操作函数具体定义如下:void MergeList_L(LinkList LA,LinkList LB,LinkList &LC)
编程要求
根据提示,在右侧编辑器中补充代码,完成MergeList_L
操作函数,以实现链表的合并。具体要求如下:
MergeList_L
:已知单链表LA
和LB
的元素按值非递减排列,归并LA
和LB
得到新的单链表LC
,LC
的元素也按值非递减排列。
提示:已知单链表 A
和 B
中的数据元素按值非递减有序排列,现要求将 A
和 B
归并为一个新的单链表 C
,且 C
中的数据元素仍按值非递减有序排列。
例如:
A=(1,7,8)
B=(2,4,6,8,10,11)
则合并后的C=(1,2,4,6,7,8,8,10,11)
测试说明
平台会对你编写的代码进行评测,测试文件为step3/Main.cpp
,可在右侧文件夹中进行查看:
测试输入: 4
//输入A表的元素个数
3 5 8 11
//输入4个数据元素,创建A表
7
//输入B表的元素个数
2 6 8 9 11 15 20
//输入7个数据元素,创建B表
预期输出: 2 3 5 6 8 8 9 11 11 15 20
//输出合并后的C表
/*************************************************************
链表的合并 实现文件
更新于2020年4月21日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
void LL_Initiate(LinkList &L)
//单链表的初始化,即:构造一个带头结点的空的单链表
{
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
}
void LL_Free(LinkList &L)
// 释放链表中各个结点。
{
LinkList p;
while(L)
{
p=L;
L=L->next;
free(p);
}
}
bool LL_IsEmpty(LinkList L)
// 判断链表是否为空。
{
return L->next==NULL;
}
void LL_Create_H(LinkList &L,int n)
// 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。
{
LNode *s; int i;
L=(LNode *)malloc(sizeof(LNode)); L->next=NULL; //建立一个带头结点的空链表
for(i=0;i<n;i++)
{
s=(LNode *)malloc(sizeof(LNode)); //生成新结点
scanf("%d", &s->data); //输入元素值
s->next=L->next; L->next=s; //插入到表头
}
}
void LL_Create_R(LinkList &L,int n)
// 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。
{
LNode *r,*s; int i;
L=(LNode *)malloc(sizeof(LNode)); L->next=NULL; //建立一个带头结点的空链表
r=L; //尾指针r指向头结点
for(i=0;i<n;i++)
{
s=(LNode *)malloc(sizeof(LNode)); //生成新结点
scanf("%d", &s->data); //输入元素值
s->next=NULL; r->next=s; //插入到表尾
r=s; //r指向新的尾结点
}
}
void LL_Print(LinkList L)
// 输出整个链表。
{
LNode *p;
p=L->next;
while(p)
{
printf("%d ",p->data); p=p->next;
}
printf("\n");
}
void MergeList_L(LinkList LA,LinkList LB,LinkList &LC)
//已知单链表LA和LB的元素按值非递减排列
//归并LA和LB得到新的单链表LC,LC的元素也按值非递减排列。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
LinkList p,q,r,s;
LC=(LNode *)malloc(sizeof(LNode));
int min;
p=LA->next;q=LB->next;
LC->next=p;
for(;p->next!=NULL;p=p->next);
p->next=q;
r=LC->next;s=LC->next->next;
for(;r->next!=NULL;r=r->next)
for(s=r->next;s!=NULL;s=s->next)
if(r->data>s->data)
{
min=s->data;
s->data=r->data;
r->data=min;
}
/********** End **********/
}