有序链表的合并
/*Name: 有序链表的合并
Copyright:
Author: 巧若拙
Date: 22-11-14 16:13
Description:
分别用递归和非递归两种方式实现两个有序链表(不含头结点)的合并
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef char ElemType;
typedef int Status; //函数类型,其值是函数结果状态代码,如OK等
typedef struct Node{
ElemType data;//数据域
struct Node *next;//指针域
} Node, *LinkList;
void CreatList(LinkList *head);//创建一个不带头结点的单链表
void DisplayList(LinkList head);//输出单链表的所有结点
void SortList(LinkList *head);//选择排序法
LinkList Merge_1(LinkList hA, LinkList hB);//合并有序链表(非递归)
LinkList Merge_2(LinkList hA, LinkList hB);//合并有序链表(递归)
int main(void)
{
LinkList a = NULL;
LinkList b = NULL;
LinkList c = NULL;
CreatList(&a);//创建一个不带头结点的单链表
DisplayList(a);//输出单链表的所有结点
SortList(&a);//选择排序法
DisplayList(a);//输出单链表的所有结点
CreatList(&b);//创建一个不带头结点的单链表
DisplayList(b);//输出单链表的所有结点
SortList(&b);//选择排序法
DisplayList(b);//输出单链表的所有结点
c = Merge_2(a, b);//合并有序链表
DisplayList(c);//输出单链表的所有结点
return 0;
}
void CreatList(LinkList *head)//创建一个不带头结点的单链表
{
int i;
Node *p, *s;
//创建第一个结点
*head = (LinkList)malloc(sizeof(Node));
if (!*head)
{
printf("Out of space!");
exit(0);
}
p = *head;
p->data = rand()%26 + 'A';
p->next = NULL;
for (i=1; i<5; i++)//创建其余的结点
{
s = (LinkList)malloc(sizeof(Node));
if (!s)
{
printf("Out of space!");
exit(0);
}
s->data = rand()%26 + 'A';
s->next = NULL;
p->next = s;
p = p->next;
}
}
void DisplayList(LinkList head)//输出单链表的所有结点
{
while (head)
{
printf("%c ", head->data);
head = head->next;
}
printf("\n");
}
void SortList(LinkList *head)//选择排序法
{
ElemType temp;
Node *p, *pre, *min;
for (min=pre=*head; pre->next; min=pre=pre->next)
{
for (p=pre->next; p; p=p->next)
{
if (p->data < min->data)
min = p;
}
if (min != pre)//交换数据域
{
temp = min->data;
min->data = pre->data;
pre->data = temp;
}
}
}
LinkList Merge_1(LinkList hA, LinkList hB)//合并有序链表(非递归)
{
Node *p, *head;
head = (LinkList)malloc(sizeof(Node)); //先设置一个头结点
if (!head)
{
printf("Out of space!");
exit(0);
}
p = head;
while (hA && hB)
{
if (hA->data < hB->data)
{
p->next = hA;
p = hA;
hA = hA->next;
}
else
{
p->next = hB;
p = hB;
hB = hB->next;
}
}
p->next = hA ? hA : hB;
p = head->next; //删除头结点
free(head);
return p;
}
LinkList Merge_2(LinkList hA, LinkList hB)//合并有序链表(递归)
{
if (!hA)
return hB;
else if (!hB)
return hA;
if (hA->data < hB->data)
{
hA->next = Merge_2(hA->next, hB);
return hA;
}
else
{
hB->next = Merge_2(hB->next, hA);
return hB;
}
}