学习以及成为想要成为的人day11

这篇博客介绍了如何使用线性表结构实现有序顺序表的合并。通过C语言展示了顺序表和链表两种方式的实现,包括初始化、赋值、显示和合并操作。代码清晰易懂,适合初学者理解和实践。此外,还提供了青岛大学王卓老师在B站上的相关讲解链接,以便进一步学习。
摘要由CSDN通过智能技术生成

线性表的简单应用

这两天一直在看书上的基于线性表结构设计的简单算法:有序线性表的合并,说老实话,只要看懂了算法,用某一种编程语言去实现并不难,难的是真正理解这一算法,并在以后的实践中能够灵活运用。

代码如下:

顺序表实现的:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
#define MAXSIZE 100
#define OK      0
#define ERROR   -1
typedef struct {
	int length;
	ElemType *elem;
}SqList;
int InitList(SqList &L){//初始化一个空的顺序表
	L.elem=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE);
	if(!L.elem){
		printf("内存分配失败");
		return ERROR;
	}
	L.length=0;
	return OK;
}
void CreateList(SqList &L,int n){//给顺序表的元素赋值
	printf("请输入%d个整数(以空格间隔开来:)\n",n);
	for(int i=0;i<n;i++){
		int num;
		scanf("%d",&num);
		L.elem[i]=num;
		L.length++;
	}
}
void DisplayList(SqList &L){//输出顺序表
	for(int i=0;i<=L.length-1;i++)
		printf("%d ",L.elem[i]);
	    printf("\n");
}
void MergeList_Sq(SqList LA,SqList LB,SqList &LC){
	//将已知的有序顺序表LA、LB按值非递减排列成新表LC,新表LC也按值非递减排列
	//新表的长度为待合并的两表的长度之和
	LC.length=LA.length+LB.length;
	//为合并后的新表分配一个地址空间
	LC.elem=new ElemType[LC.length];
	ElemType *pa,*pb,*pc,*pa_last,*pb_last;
	pa=LA.elem;//指针pa指向LA的首元素
	pb=LB.elem;//指针pb指向LB的首元素
	pc=LC.elem;//指针pc指向LC的首元素
	pa_last=LA.elem+LA.length-1;//指针pa_last指向LB的尾元素
	pb_last=LB.elem+LB.length-1;//指针pb_last指向LA的尾元素
	while((pa<=pa_last)&&(pb<=pb_last)){
	//当两表都没到达表尾时,分别比较两表的元素,小的插入LC表尾,并把指针移动至下一元素,重复此过程
		if(*pa<=*pb)
			*pc++=*pa++;
		else
			*pc++=*pb++;
	}
	//当有一个表的指针到达队尾时,就将其剩余元素插入LC表尾
	while(pa<=pa_last)
		*pc++=*pa++;
	while(pb<=pb_last)
		*pc++=*pb++;
}
int main(){
	SqList LA,LB,LC;
	InitList(LA);
	InitList(LB);

	CreateList(LA,4);
	CreateList(LB,7);

	printf("顺序表LA是这样的:\n");
	DisplayList(LA);

	printf("顺序表LB是这样的:\n");
	DisplayList(LB);

	MergeList_Sq(LA,LB,LC);
	printf("合并后的顺序表LC是这样的:\n");
	DisplayList(LC);

	system("pause");
	return 0;
}

链表实现的:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
#define OK 0
#define ERROR -1
typedef struct LNode{
	ElemType data;
	struct LNode* next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n){//后插法建立单链表并赋值其中元素
	L=new LNode;
	L->next=NULL;
	LNode *r=L;
	int num=0;
	printf("请输入%d个元素:\n",n);
	for(int i=0;i<n;i++){
		LNode *p=(LNode*)malloc(sizeof(LNode));
		scanf("%d",&num);
		p->data=num;
		p->next=NULL;
		r->next=p;
		r=p;
	}
}
void MergeList_L(LinkList &LA,LinkList &LB,LinkList &LC){
	//合并LA和LB得到的新的单链表LC,LC的元素按值非递减排列
	LNode *pa,*pb,*pc;
	pa=LA->next;//新生成的节点指针pa指向LA的第一个元素
	pb=LB->next;//新生成的节点指针pb指向LB的第一个元素
	pc=LC=LA;//将LA的头结点作为LC的头结点,并使指针pc指向LC
	while(pa&&pb){
	//如果LA和LB均未到达表尾,依次摘取两表中较小的节点插入到LC的最后
		if(pa->data<=pb->data){
			pc->next=pa;
			pc=pa;
			pa=pa->next;
		}
		else{
			pc->next=pb;
			pc=pb;
			pb=pb->next;	
		}
	}
	//这样一句看似简单的代码实际上就把将某个非空的链表中的剩余元素插入LC的最后这份工作完美做完了
	pc->next=pa?pa:pb;
	//把LB的表头删掉,这个也非常重要
	delete LB;
}
void DisplayList(LinkList &L){
	LNode *p;
	p=L->next;
	while(p){
	printf("%d ",p->data);
	p=p->next;
	}
	printf("\n");
}
int main(){

	LinkList LA,LB,LC;

	CreateList_R(LA,4);
	printf("表LA是这样的:\n");
	DisplayList(LA);

	CreateList_R(LB,7);
	printf("表LB是这样的:\n");
	DisplayList(LB);

	MergeList_L(LA,LB,LC);
	printf("合并后的表LC是这样的:\n");
	DisplayList(LC);

	system("pause");
	return 0;
}

如果再回首的时候,对此有疑问,可以去看B站上青岛大学王卓老师的讲解,非常清晰。网址是:

https://www.bilibili.com/video/BV1QW411y7iL

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值