俩个有序顺序表的合并(好好学习)

举报
yd_249383650 发表于 2023/03/30 19:01:53 2023/03/30
【摘要】 ​ Elementype GetElem(list L, Position pos){ if (pos<0 || pos>L->last) { return ERROR; } else { return L->Data[pos]; }}//给出LA LB俩个递增顺序表,要求合并成为LC有序链表(LC为空)struct LNode { Elementype Data[Maxszie]; P...

 

Elementype GetElem(list L, Position pos)
{
	if (pos<0 || pos>L->last)
	{
		return ERROR;
	}
	else
	{
		return L->Data[pos];
	}
}
//给出LA LB俩个递增顺序表,要求合并成为LC有序链表(LC为空)
struct LNode {
	Elementype Data[Maxszie];
	Position Last
};
//Last为最后一个下标值

今天上课的时候老师提到了这题,上课的时候脑子卡了,居然没做出来,在路上才想起来怎么操作

对于这道题首先考虑的是LA  LB为空的三种情况,

void merge(list a,list b,list c)

1.即LA为空,LB也为空的时候,直接返回LC也就为空了,不需要任何操作

2.即LA为空,LB不为空的时候,将LA的Data全部拷贝进去,将LC->Last调为LB->Last

3.即LB为空,LA不为空的时候,将LB的Data全部拷贝进去,将LC->Last调为LC->Last

这三种是比较先考虑的,拷贝for循环就对了;(为空的判断的条件为Last=-1)

	if (a->Last == -1 && b->Last == -1)
	{
		return;
	}
	else if (a->Last != -1 && b->Last == -1)
	{
		for (int i = 0; i <= a->Last; i++)
		{
			c->Data[i] = a->Data[i];
		}
		c->Last = a->Last;
	}
	else if (b->Last != -1 && a->Last == -1)
	{
		for (int i = 0; i <= b->Last; i++)
		{
			c->Data[i] = b->Data[i];
		}
		c->Last = b->Last;
	}

接下来就是一些比较常规的情况了;我的想法是定义三个类似指针的玩意,来定位三个顺序表的下标。即pa =pb= pc=0;然后开始循环进行比较插入,判断pa pb对应位置的数据大小,那个小就把该下标下的data值赋给LC顺序表,循环下去直到pa 大于LA->Last,或者pb 大于LB->Last,最后只要还没有插入LC中的对应LA或LB的值全部插进LC


听到这里可能还有点懵,那么我们就用图来说明以下吧

刚开始的时候:

编辑

 第一次以后,pa++,pc++

编辑

第二次 pa++,pc++

 编辑

第三次:pb++,pc++ 

 编辑

 第四次:pa++,pc++

编辑

 到这个时候我们发现pa已经大于LA-->Last   ,接下来就只需要把LB后面的全部放进去就可以了

编辑

 这就是完成这道题的基本思路了,那么如何将PB中未插的数据如何全部插入呢,很简单。一个for循环,我们可以知道这个时候 pa大于 LA->last   但pb小于LB->Last;所以只要for循环到pb大于LB->Last就可以了!!!

这个时候的控制条件一定要十小心!!!

在代码的时候要判断到底是LA全部插了还是LB全部插了,可以通过

if (pa > a->Last )
这个是PA全部插入了

以下是代码实现:

​
	else 
	{
		c->Last = a->Last + b->Last + 1;
		int pa, pb, pc;
		pa = pb = pc = 0;
		for (; pa <= a->Last&&pb <=b->Last; pc++)
		//如果a的都插入或b全部插入了,就结束
		{
			if (a->Data[pa]< b->Data[pb])
			{
				c->Date[pc] = a->Data[pa];
				pa++;
			}
			else
			{
				c->Data[pc] = b->Data[pb];
				pb++;
			}
		}
		if (pa > a->Last )
		//如果是a表的全部插入了,那么就将b表全部插入
		{
			for (; pb <= b->Last; pb++,pc++)
			{
				c->Data[pc] = b->Data[pb];
			}
		}
		else//如果是b表的全部插入了,那么就将a表全部插入
		{
			for (; pa <= a->Last; pa++, pc++)
			{
				c->Data[pc] = a->Data[pa];
			}
		}
	}

​

这就是我的思路

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。