合并两个有序链表

目录

1. 链表的数据结构

2. main()

3. 初始化链表

4. 插入结点

5. 合并两个有序的链表:多种方法


2. main()

int main()
{
	LinkList LL; // 声明链表指针变量
	LL = NULL;

	// 初始化链表
	LL = InitList1();  	
	cout << "LL = " << LL << endl;

	//InitList3(LL); // C++引用
	//cout << "LL = " << LL << endl;

	ElemType ee;
	LinkList La, Lb, Lc;

	//InitList3(La);
	La = InitList1();
	Lb = InitList1();
	Lc = InitList1();

	// 创建链表:先插入
	ee = 1;  InsertList(Lb, 1,&ee);
	ee = 2;	InsertList(La,1,&ee);
	PrintList(La);	PrintList(Lb);

	// 尾插法
	//ee = 1;  PushBack(Lb, &ee);
	//ee = 2;  PushBack(La, &ee);
	ee = 3;  PushBack(Lb, &ee);
	ee = 4;  PushBack(Lb, &ee);
	ee = 5;  PushBack(La, &ee);
	ee = 6;  PushBack(Lb, &ee);
	ee = 7;  PushBack(Lb, &ee);
	ee = 8;  PushBack(Lb, &ee);
	ee = 9;  PushBack(La, &ee);
	ee = 10; PushBack(La, &ee);
	//cout << "La = " << PrintList(La) << endl;  // 错误
	cout << "La = ";  PrintList(La);	
	cout << "Lb = ";  PrintList(Lb);


	//MergeList(La,Lb,Lc);
	//cout << "合并La、Lb ->  Lc = ";
	//PrintList(Lc);

	MergeList2(La, Lb, Lc);
	//PrintList(Lb);   // MergeList2()中  delete Lb;再次打印会报错
	cout << "合并La、Lb ->  Lc = ";
	PrintList(Lc);


	system("pause");
	return 0;
}

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<iostream>
using namespace std;

typedef int ElemType; // 自定义链表的数据元素为整数。
typedef struct LNode
{
	ElemType data;       // 存放结点的数据元素。
	struct LNode* next;  // 指向下一个结点的指针。
}LNode, * LinkList;


//插入
int InsertList(LinkList LL, unsigned int ii, ElemType* ee)
{
	if (LL == NULL || ee == NULL)
	{
		cout << "链表LL或元素ee不存在" << endl;
		return 0;
	}
	// 位置不合法
	if (ii < 1)
	{
		cout << "插入位置不合法" << endl;
		return 0;
	}

	// 要在位序ii插入结点,必须找到ii-1结点。
	LNode* pp = LL;   //指针pp指向头结点,逐步往后移动,如果为空,表示后面没结点了。
	int kk = 0;      //kk指向的是第几个结点,从头结点0开始,pp每向后移动一次,kk就加1。

	while (pp != NULL && kk < ii - 1)  // 找到 ii-1 节点 pp (重点)
	{
		pp = pp->next;
		kk++;
	}

	if (pp == NULL)
	{
		cout << "位置不合法,超过了表长:" << endl;
		return 0;
	}

	LNode* tmp = new LNode;
	if (tmp == NULL) { return 0; }

	memcpy(&tmp->data, ee, sizeof(ElemType)); // 如何实现C++风格?

	//cout << "测试:" << tmp->data << endl;

	tmp->next = pp->next;
	pp->next = tmp;

	return 1;
}






// 初始化链表LL,返回值:失败返回NULL,成功返回头结点的地址。
LNode* InitList1()
{
	LNode* head = (LNode*)malloc(sizeof(LNode));  // 分配头结点。

	if (head == NULL) return NULL;  // 内存不足,返回失败。

	head->next = NULL;  // 头结点的下一结点暂时不存在,置空。

	return head;
}
// 初始化:C++ 引用方式
int InitList3(LinkList& LL)
{
	if (LL != NULL) { printf("链表L已存在,在初始化之前请先释放它。\n"); return 0; }

	//LNode* head = (LNode*)malloc(sizeof(LNode));  // 分配头结点。
	LNode* head = new LNode; // C++分配头结点。

	if (head == NULL) return 0;  // 内存不足,返回失败。

	head->next = NULL;  // 头结点的下一结点暂时不存在,置空。

	LL = head;

	return 1;
}


// 在链表LL的尾部插入元素ee,返回值:0-失败;1-成功
int PushBack(LinkList LL, ElemType* ee)
{
	if (LL == NULL || ee == NULL) 
	{
		printf("链表LL或元素ee不存在。\n"); 
		return 0;
	}

	LNode* pp = LL;

	// 找到最后一个结点
	while ( pp->next != NULL )
	{
		pp = pp->next;
	}

	// 找到后插入
	LNode* tmp = new LNode;
	memcpy(&tmp->data, ee, sizeof(ElemType));

	pp->next = tmp;
	tmp->next = NULL;

	return 1;
}


int MergeList(LinkList La, LinkList Lb, LinkList Lc)
{
	if ((La == NULL) || (Lb == NULL) || (Lc == NULL)) { printf("表La、Lb、Lc至少有一个不存在。\n"); return 0; }

	La = La->next;
	Lb = Lb->next;

	LNode* pp;

	while ( La!=NULL && Lb!=NULL ) 
	{
		if (La->data < Lb->data) 
		{
			pp = La;
			La = La->next;

			//Lc->next = new LNode;
			//Lc = Lc->next;
			//memcpy(&Lc->data, &pp->data, sizeof(ElemType)); // Lc 
			//Lc->next = NULL;

		}
		else 
		{
			pp = Lb;
			Lb = Lb->next;

			//Lc->next = new LNode;
			//Lc = Lc->next;
			//memcpy(&Lc->data, &pp->data, sizeof(ElemType)); // Lc 
			//Lc->next = NULL;

		}

		Lc->next = new LNode;
		Lc = Lc->next;
		memcpy(&Lc->data,&pp->data, sizeof(ElemType)); // Lc 
		Lc->next = NULL;
	
	}


	while (La != NULL) 
	{
		Lc->next = new LNode;
		Lc = Lc->next;
		memcpy(&Lc->data, &La->data, sizeof(ElemType));
		Lc->next = NULL;
		La = La->next;
	}

	while (Lb != NULL)
	{
		Lc->next = (LNode*)malloc(sizeof(LNode));  // 分配一个新结点。
		Lc = Lc->next;
		memcpy(&Lc->data, &Lb->data, sizeof(ElemType));
		Lc->next = NULL;
		Lb = Lb->next;
	}

	return 1;

}

// 在链表La上操作
int MergeList2(LinkList &La, LinkList &Lb, LinkList &Lc) 
{
	LinkList pa = La->next;
	LinkList pb = Lb->next;

	LinkList pc = Lc = La;

	while (pa!=NULL && pb != NULL) 
	{
		if (pa->data < pb->data) 
		{
			pc->next = pa; 
			pc = pa;
			pa = pa->next;
		}
		else 
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		
		}

	}
	//if(pa->next){ pc->next = pa; }else{ pc->next = pb; }
	pc->next = pa ? pa : pb;  

	//delete Lb;
	
	return 1;

}


void PrintList(LinkList LL)
{
	if (LL == NULL)
	{
		cout << "链表LL不存在" << endl;
		return;
	}

	LNode* pp = LL->next; // 从第1个结点开始
	while (pp != NULL)
	{
		cout << pp->data << " ";
		pp = pp->next;
	}
	cout << endl;
}


int main()
{
	LinkList LL; // 声明链表指针变量
	LL = NULL;

	// 初始化链表
	LL = InitList1();  	
	cout << "LL = " << LL << endl;

	//InitList3(LL); // C++引用
	//cout << "LL = " << LL << endl;

	ElemType ee;
	LinkList La, Lb, Lc;

	//InitList3(La);
	La = InitList1();
	Lb = InitList1();
	Lc = InitList1();

	// 创建链表:先插入
	ee = 1;  InsertList(Lb, 1,&ee);
	ee = 2;	InsertList(La,1,&ee);
	PrintList(La);	PrintList(Lb);

	// 尾插法
	//ee = 1;  PushBack(Lb, &ee);
	//ee = 2;  PushBack(La, &ee);
	ee = 3;  PushBack(Lb, &ee);
	ee = 4;  PushBack(Lb, &ee);
	ee = 5;  PushBack(La, &ee);
	ee = 6;  PushBack(Lb, &ee);
	ee = 7;  PushBack(Lb, &ee);
	ee = 8;  PushBack(Lb, &ee);
	ee = 9;  PushBack(La, &ee);
	ee = 10; PushBack(La, &ee);
	//cout << "La = " << PrintList(La) << endl;  // 错误
	cout << "La = ";  PrintList(La);	
	cout << "Lb = ";  PrintList(Lb);


	//MergeList(La,Lb,Lc);
	//cout << "合并La、Lb ->  Lc = ";
	//PrintList(Lc);

	MergeList2(La, Lb, Lc);
	//PrintList(Lb);   // MergeList2()中  delete Lb;再次打印会报错
	cout << "合并La、Lb ->  Lc = ";
	PrintList(Lc);


	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值