merge lista ordenada
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
typedef int ElemType;
#include<malloc.h> /* malloc()等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<process.h> /* exit() */
/* 函数结果状态代码 */
//#define TRUE 1
//#define FALSE 0
#define OK 1
#define ERROR 0
//#define INFEASIBLE -1
//#define OVERFLOW -2
/* ----------------------- 线性表的单链表存储结构 ------------------------*/
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */
/* ---------------------------------------------------------------------------*/
/* ---------------------------- 需要用到的线性表单链表的基本操作实现 ---------------------------------*/
Status InitList(LinkList *L)
{ /* 操作结果:构造一个空的线性表L */
*L = (LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */
if (!*L) /* 存储分配失败 */
exit(OVERFLOW);
(*L)->next = NULL; /* 指针域为空 */
return OK;
}
Status ListInsert(LinkList L, int i, ElemType e) /* 算法2.9。不改变L */
{ /* 在带头结点的单链线性表L中第i个位置之前插入元素e */
int j = 0;
LinkList p = L, s;
while (p&&j < i - 1) /* 寻找第i-1个结点 */
{
p = p->next;
j++;
}
if (!p || j > i - 1) /* i小于1或者大于表长 */
return ERROR;
s = (LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
s->data = e; /* 插入L中 */
s->next = p->next;
p->next = s;
return OK;
}
void visit(ElemType c) /* ListTraverse()调用的函数(类型要一致) */
{
printf("%d ", c);
}
Status ListTraverse(LinkList L, void(*vi)(ElemType))
/* vi的形参类型为ElemType,与线性表的顺序表示和实现中相应函数的形参类型ElemType&不同 */
{ /* 初始条件:线性表L已存在 */
/* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */
LinkList p = L->next;
while (p)
{
vi(p->data);
p = p->next;
}
printf("\n");
return OK;
}
/* ---------------------------------------------------------------------------------------------------*/
void MergeList(LinkList *La, LinkList *Lb, LinkList *Lc)/* 算法2.12 */
{ /* 已知单链线性表La和Lb的元素按值非递减排列。 */
/* 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列 */
LinkList pa = (*La)->next, pb = (*Lb)->next, pc;
*Lc = pc = *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;
}
void main()
{
LinkList La, Lb, Lc;
ElemType e, e0;
Status i;
int j, k;
i = InitList(&La);
for (j = 5; j >= 1; j--)
i = ListInsert(La, 1, j);
printf("在La的表头依次插入5-1后:La=");
ListTraverse(La, visit);
i = InitList(&Lb);
for (j = 5; j >= 1; j--)
i = ListInsert(Lb, 1, j*2);
printf("在Lb的表头依次插入2,4,6,8,10后:Lb=");
ListTraverse(Lb, visit);
MergeList(&La, &Lb, &Lc); /* 按非递减顺序归并La和Lb,得到新表Lc */
printf("Lc="); /* 输出链表Lc的内容 */
ListTraverse(Lc, visit);
}
El resultado: