#include <iostream> //头文件io流
#include <fstream> //头文件文件流
using namespace std; //命名空间
#define ERROR 0 //宏,作为错误返回
// 定义单链表
typedef struct LNode {
int data; //链表数据域
struct LNode *next; //链表指针域
}LNode,*LinkList; //链表变量LNode,链表指针LInkList
int num_a; //la元素的个数
int num_b; //lb元素的个数
int st = 'A'; //文件名
// 创建单链表
void InitList_LL(LinkList &L) {
L = new LNode; //创建头节点
L->next = NULL; //指针为NULL
}
// 依次向单链表L输入对应的数据
void LinkList_Input(LinkList &L, int n) {
LNode *p, *r; //定义指针
r = L; //r指向链表
char filename[20] = { 0 };
cout << "请输入非递减单向链表" << (char)st << "的数据文件名称(文件名+“.txt”,比如List" << (char)st << ".txt)" << endl;
++st;
gets_s(filename); //获取文件名
fstream file; //文件流
file.open(filename); //打开文件
if (!file) //文件打开成功?
{
cout << "未找到相关的数据文件,无法打开." << endl;
exit(ERROR);
}
while (!file.eof()) { //文件结尾
p = new LNode; //p开辟新空间
file >> p->data; //往文件输入数据
p->next = NULL; //p指针域置为空
r->next = p; //将r的next指针指向p
r = p; //r指向p
n++;
}
file.close();
}
// 输出链表的数据结点
void Output_LL(LinkList L)
{
int i = 0;
LNode *p;
p = L->next;
while (p) {
if (i)
cout << ",";
cout << p->data;
p = p->next;
i = 1;
}
}
// 链式存储结构有序表的合并
void MergeLinkList_LL(LinkList &LA, LinkList &LB, LinkList &LC) {
LinkList pa, pb, pc; // 定义三个链表
pa = LA->next; // pa指向LA指针
pb = LB->next; // pb指向LB指针
LC = LA; // 用La的头结点作为LC头结点
pc = LC; // pc的初值指向LC的头结点
while (pa && pb) { //链表不为空
if (pa->data <= pb->data) //先放小的数据
{
pc->next = pa; //pc的next指向pa
pc = pa; //pc指向pa
pa = pa->next; //pa指向pa的next
}
else
{
pc->next = pb; //pc的next指向pb
pc = pb; //pc指向pb
pb = pb->next; //pa指向pb的next
}
}
pc->next = pa ? pa : pb; // 插入非空表的剩余段
delete LB;
}
int main()
{
LinkList la, lb, lc; // 定义三个链表
InitList_LL(la); //初始化链表la
LinkList_Input(la, num_a); //输入数据
Output_LL(la); //输出数据
cout << endl; //换行
InitList_LL(lb); //初始化链表lb
LinkList_Input(lb, num_b); //输入数据
Output_LL(lb); //输出数据
cout << endl; //换行
InitList_LL(lc); //初始化lc
MergeLinkList_LL(la, lb, lc);//合并la、lb到lc
cout << "非递减单向链表A B合并后非递减单向链表C为:\n";
Output_LL(lc); //输出lc
cout << endl;
return 0;
}