第2章课本算法实现 MergeList

/************************************
 *							        *
 * 文件夹: ▲02 线性表\05 MergeList *
 * 							        *
 * 文件名: MergeList.h              *
 * 							        *
 * 内  容: 单链表归并相关操作列表   *
 *                                  *
 ************************************/

#ifndef MERGELIST_H
#define MERGELIST_H

#include <stdlib.h>										//提供malloc、realloc、free、exit原型
#include "../04 SinglyLinkedList/SinglyLinkedList.c"	//**▲02 线性表**//

/* 单链表归并函数列表 */
void MergeList_L(LinkList La, LinkList *Lb, LinkList *Lc);
/*━━━━━━━━━━━━━━━━━━━━━━━━┓
┃(01)算法2.12:C=A+B,且保持元素相对位置不变。   ┃
┃    Lc利用La的头结点,Lb中结点均插入新链表Lc中。┃    
┗━━━━━━━━━━━━━━━━━━━━━━━━*/

#endif
/************************************
 *					                *
 * 文件夹: ▲02 线性表\05 MergeList *
 * 					                *
 * 文件名: MergeList.c              *
 * 				                    *
 * 算  法: 2.12                     * 
 *                                  *
 ************************************/

#ifndef MERGELIST_C
#define MERGELIST_C

#include "MergeList.h"					//**▲02 线性表**//

/*═════╗
║ 算法2.12 ║ 
╚═════*/
void MergeList_L(LinkList La, LinkList *Lb, LinkList *Lc)
{										//指针Lb,Lc要改变,故形参是指向指针的指针 
	LinkList pa, pb, pc;
	
	pa = La->next;
	pb = (*Lb)->next;
	pc = *Lc = La;						//用La的头结点作为Lc的头结点 						

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

	pc->next = pa ? pa : pb;			//插入剩余段 
	
	free(*Lb);							//释放Lb的头结点
	*Lb = NULL; 
}

#endif
/************************************
 *						            *
 * 文件夹: ▲02 线性表\05 MergeList *
 * 						            *
 * 内  容: 单链表归并相关函数测试   *
 *                                  *
 ************************************/

#include <stdio.h>
#include "MergeList.c"					//**▲02 线性表**//
	
void PrintElem(LElemType_L e);			//测试函数,打印整型
	
int main(int argc, char **argv)
{
	FILE *fp;
	LinkList La, Lb, Lc;
	int m;									

	m = 5;
	
	printf("作为示例,La长度设定为 %d ,Lb设定为 %d ,创建La和Lb...\n", m, m);
	fp = fopen("TestData_HL.txt", "r");	//文件指针,指向数据源	
	CreateList_HL(fp, &La, m);
	fclose(fp);
	fp = fopen("TestData_TL.txt", "r");	//文件指针,指向数据源
	CreateList_TL(fp, &Lb, m);	
	fclose(fp);

	printf("La = ");
	ListTraverse_L(La, PrintElem);
	printf("\n");
	printf("Lb = ");
	ListTraverse_L(Lb, PrintElem);
	printf("\n\n");
	PressEnter;
		
	MergeList_L(La, &Lb, &Lc);
	printf("合并La和Lb为Lc = ");
	ListTraverse_L(Lc, PrintElem);
	printf("\n\n");
	PressEnter;

	return 0;
}

void PrintElem(LElemType_L e)
{
	printf("%d ", e);
}

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/86689171