《数据结构(严蔚敏版)》学习笔记(二)——合并线性表

《数据结构(严蔚敏版)》学习笔记(二)——合并线性表

算法是将两个按非递减序排列的线性表La,Lb,合并成一个按非递减序排列的线性表Lc。

相同点是通过若干次比较后,将较小的值放置Lc中,直到把短的那一串放完。然后把长的那一串的结尾链接到Lc后。

时间复杂度相同 T = O(La.length + Lb.length)

但空间复杂度不同。顺序表结构要另分配(La.length + Lb.length)的空间作为Lc。

而链表的Lc只需要使用La的空间指针。


<span style="font-size:14px;">/*------$将两个线性表合并为一个线性表$-------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*--初始定义--*/
typedef int		Status;
typedef int		ElemType;
#define OK			1
#define OVERFLOW	-1
#define MAX_SIZE	100

/*动态顺序线性表-DSqList*/
typedef struct{
	ElemType	*elem;
	int			length;
	int			listsize;
}SqList;

Status InitList_Sq(SqList &L)
{
	if(!(L.elem = (ElemType *)malloc(MAX_SIZE * sizeof(ElemType))))	exit(OVERFLOW);
	L.length = 0;
	L.listsize = MAX_SIZE;
	return OK;
}

/*----算法[合并两个有序线性表]  T=O(La.length + Lb.length)----*/
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc)
{
	//La,Lb按值非递减排序
	ElemType *pa,*pb,*pc;
	ElemType *pa_last,*pb_last;

	pa = La.elem; pb = Lb.elem;
	Lc.listsize = Lc.length = La.length + Lb.length;
	pc = Lc.elem = (ElemType *)malloc(Lc.listsize * sizeof(ElemType));
	if(!Lc.elem)	exit(OVERFLOW);
	pa_last = La.elem + La.length - 1;
	pb_last = Lb.elem + Lb.length - 1;
	while(pa <= pa_last && pb <= pb_last){
		if(*pa <= *pb)	*pc++ = *pa++;
		else			*pc++ = *pb++;
	}
	while(pa <= pa_last)	*pc++ = *pa++;
	while(pb <= pb_last)	*pc++ = *pb++;
}

void display(SqList &L)
{
	int i;
	ElemType *p;
	p = L.elem;
	for(i=0;i<L.length;i++,p++)
		printf("%d ",*p);
	printf("\n");
}

void CreateList_Sq(SqList &L,ElemType sz[],int n)
{
	int i;
	ElemType *p;
	p = L.elem;
	for(i=0;i<n;i++,p++)
		*p = sz[i];
	L.length = n;
}

/*线性单链表-LinkList*/
typedef struct LNode{
	ElemType		data;
	struct LNode	*next;
}LNode,*Link;
typedef struct{
	Link	head,tail;
	int		len;
}LinkList;

/*----算法[合并两个有序线性表]  T=O(La.length + Lb.length)----*/
void MergeList_L(Link &La,Link &Lb,Link &Lc)
{
	Link pa,pb,pc;
	pa = La->next;  pb = Lb->next;
	Lc = pc = La;
	while(pa && pb){
		if(pa->data <= pb->data)					//选择a节点
			{	pc->next = pa; pc = pa; pa = pa->next;	}
		else										//选择b节点
			{	pc->next = pb; pc = pb; pb = pb->next;	}
	}
	pc->next = pa?pa:pb;
	free(Lb);
}


void CreateList_L(Link &L,ElemType sz[],int n)
{
	int i;
	Link p;
	L = (LNode *)malloc(sizeof(LNode));
	L->next = NULL;
	for(i=n;i>0;i--){
		p = (LNode *)malloc(sizeof(LNode));
		p->data = sz[i-1];
		p->next = L->next;L->next = p;
	}
}

void display_L(Link L)
{
	Link p = L->next;
	while(p){
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n");
}

int main()
{
	/*顺序存储结构*/
	SqList La,Lb,Lc;
	InitList_Sq(La);
	InitList_Sq(Lb);
	
	ElemType sz1[]={1,13,44,56,67,68};
	ElemType sz2[]={2,22,43,51,55,78,99,101};
	CreateList_Sq(La,sz1,sizeof(sz1)/sizeof(sz1[0]));
	CreateList_Sq(Lb,sz2,sizeof(sz2)/sizeof(sz2[0]));
	display(La);display(Lb);
	MergeList_Sq(La,Lb,Lc);
	display(Lc);

	/*链式存储结构*/
	Link	Lista,Listb,Listc;
	CreateList_L(Lista,sz1,sizeof(sz1)/sizeof(sz1[0]));
	CreateList_L(Listb,sz2,sizeof(sz2)/sizeof(sz2[0]));
	display_L(Lista); display_L(Listb);
	MergeList_L(Lista,Listb,Listc);
	display_L(Listc);
	return 0;
}</span>



对于顺序表的算法核心:

	<span style="font-size:14px;">pa = La.elem; pb = Lb.elem;
	pa_last = La.elem + La.length - 1;
	while(pa <= pa_last && pb <= pb_last){
		if(*pa <= *pb)	*pc++ = *pa++;
		else			*pc++ = *pb++;
	}
	while(pa <= pa_last)	*pc++ = *pa++;
	while(pb <= pb_last)	*pc++ = *pb++;</span>


对于链表的算法核心:

<span style="font-size:14px;">	while(pa && pb){
		if(pa->data <= pb->data)					//选择a节点
			{	pc->next = pa; pc = pa; pa = pa->next;	}
		else										//选择b节点
			{	pc->next = pb; pc = pb; pb = pb->next;	}
	}
	pc->next = pa?pa:pb;</span>



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值