/************************************
* *
* 文件夹: ▲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);
}