您的位置:首页 > 理论基础 > 数据结构算法

数据结构-C语言 单链线性表实现归并 C=A∪B

2017-10-16 17:32 465 查看
算法 2- 12

这是单链线性表的合并问题,假设头指针为La和Lb的单链表分别为线性表LA和LB的存储结构,现要归并La和Lb得到单链表Lc,需设立3个指针pa,pb,pc,其中pa和pb分别指向La表和Lb表中当前待比较插入的结点,而pc指向Lc表中当前最后一个结点,若pa->data<=pb->data,则将pa所指结点链接到pc所指结点之后,否则将pb所指结点链接到pc所指结点之后。当其中一个已知表全部插入Lc后,将另一表的剩余元素继续插入Lc。

#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
#define OK 1
typedef int Status;
typedef int ElemType;

//定义单链表
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;

//构造空的单链线性表
Status Init(LinkList *L)
{
*L=(LinkList)malloc(sizeof(struct LNode));//产生头结点,并使L指向此头结点
if (!*L)
exit (OVERFLOW);
(*L)->next=NULL;//指针域为空
return OK;
}

//正位序输入元素
void Create(LinkList *L, int n)
{
int i;
LinkList p, q;
q=*L;
printf("请输入%d个按值非递减排列的元素:\n", n);
for (i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
q->next=p;
q=q->next;
}
p->next=NULL;
}

//输出元素
void print(LinkList *L)
{
LinkList p;
p=(*L)->next;
while (p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

//算法2-11 将两个有序链表归并为一个有序链表
void MergeList(LinkList *La, LinkList *Lb, LinkList *Lc)
{
//已知单链线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链线性表Lc,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的头结点
}

int main()
{
LinkList La, Lb, Lc;
Init(&La);
Init(&Lb);
Init(&Lc);
int n=5;
Create(&La, n);
printf("La = ");
print(&La);
Create(&Lb, n);
printf("Lb = ");
print(&Lb);
MergeList(&La, &Lb, &Lc);
printf("Lc= La ∪ Lb= ");
print(&Lc);
printf("\n*************Programmed by DXH924***************");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息