c++ 有序链表的合并案例(文件)

在这里插入图片描述
在这里插入图片描述

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值