第二章算法设计题1
题目描述
将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。
代码实现
#pragma once
#include <iostream>
#include<string>
#define MAXSIZE 100
using namespace std;
//单链表的存储结构
typedef struct Lnode
{
int data;//数据域
struct Lnode* next;//指针域
}Lnode, * LinkList;
//单链表的初始化
void InitList(LinkList& L)
{
L = new Lnode;
L->next = NULL;
}
//头插法创建单链表
void CreateList_H(LinkList& L, int n)
{
//创建带头结点的单链表 并初始化
L = new Lnode;
L->next = NULL;
//创建新的结点
Lnode* p;
for (int i = n - 1; i >= 0; i--)
{
p = new Lnode;
cout << "请输入第" << i + 1 << "个数据" << endl;
cin >> p->data;
p->next = L->next;
L->next = p;
}
}
//打印
void show(LinkList L)
{
//创建一个结点 并指向L的首元结点
Lnode* p;
p = L->next;
//首元结点不为空
while (p)
{
cout << p->data << " ";
//指向下一个结点
p = p->next;
}
cout << endl;
}
//合并 不允许有重复数据
void merge_list(LinkList &LA, LinkList& LB, LinkList& LC)
{
//创建结点
Lnode* pa;
Lnode* pb;
Lnode* pc;
Lnode* q;
//指向LA的首元结点
pa = LA->next;
//指向LB的首元结点
pb = LB->next;
//将LA作为LC的头结点,pc指向LC的头结点
LC = LA;
pc = LC;
while (pa && pb)
{
//取较小者La中的元素,将pa链接在pc的后面,pa指针后移
if (pa->data < pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
//取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移
else if(pa->data>pb->data)
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
//相等时取La中的元素,删除Lb中的元素
else
{
pc->next = pa;
pc = pa;
pa = pa->next;
//删除当前pb结点
q = pb->next;
delete pb;
pb = q;
}
}
//插入剩余段
pc->next = pa ? pa : pb;
//释放LB的头结点
delete LB;
}
//销毁单链表
void DestroyList(LinkList& L)
{
Lnode* p;
while (L)
{
p = L;
L = L->next;
delete p;
}
exit(0);
}
int main()
{
//创建三个链表
LinkList LA;
LinkList LB;
LinkList LC;
//初始化需要合并的链表
InitList(LA);
InitList(LB);
//创建链表
cout << "前插法逆序输入" << endl;
cout << "请输入A的元素:" << endl;
CreateList_H(LA, 4);
cout << "请输入B的元素:" << endl;
CreateList_H(LB, 7);
cout << string(30, '*') << endl;
cout << "表LA的元素为:" << endl;
show(LA);
cout << string(30, '*') << endl;
cout << "表LB的元素为:" << endl;
show(LB);
cout << string(30, '*') << endl;
merge_list(LA, LB, LC);
cout << "表LC的元素为:" << endl;
show(LC);
//释放
DestroyList(LA);
DestroyList(LB);
DestroyList(LC);
system("pause");
return 0;
}