合并两个非递减排列的线性表 By C

使用的数据结构:

  • 线性表
    • 非递减序列:123456555789
    • 非递增排列:655553221
    • 递增:123456
    • 递减:654321

使用两种编程的方式,本质都一样的,具体可见 Data Structure - 基于realloc可自动扩展的顺序表 By C里面写到有关于,指针,地址,数组的关系。

  • 第一个方式,里面的insert方式,也可以换成数组直接写进去。
  • 第二个方式即纯指针操作
void MergeList_Sq(Sqlist La, Sqlist Lb, Sqlist& Lc) {
	/*
		已知顺序线性表La和Lb的元素按值非递减排列
		归并La和Lb得到新的顺序表Lc
		Lc的元素也按值非递减排列
	*/
	int LaLength = La.length;
	int LbLength = Lb.length;
	ElemType* LaP = La.elem;
	ElemType* LbP = Lb.elem;
	ElemType* LcP = Lc.elem;
	int t = 0;
	int k = 0;
	for (int i = 0; i < LaLength; i++)
	{
		if (t+1==LbLength)  //当b子串放置满时,将a追加在其后
		{
			for ( ;i < LaLength; i++)
			{
				ListInsert_sq(Lc, k++, LaP[i]);
			}
				return;
		}
		if (i+1 == LaLength) //当a子串放置完时,将b追加在其后
		{
			for (;t < LbLength; t++)
			{

				ListInsert_sq(Lc, k++, LaP[t]);
			}
				return;
		}
		if (LaP[i] <= LbP[t])
		{
			ListInsert_sq(Lc, k++, LaP[i]);
			if (LaP[i] = LbP[t])
			{
				ListInsert_sq(Lc, k++, LbP[t++]);
			}
		}
		else
		{
			ListInsert_sq(Lc, k++, LbP[t++]);
			i--;
		}
	}
}




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

}

合并两个非递减排列的线性表 By C_第1张图片

  • 前两行,为输入的第一个线性表
  • 中两行,第二个
  • 后四,结果

你可能感兴趣的:(算法,数据结构,C:从入门到放弃)