2021-10-15:合并两个有序的顺序表

2021年10月15日

学习内容:合并两个有序的顺序表

核心代码示例:

//合并两个有序的顺序表
void MergeSqlist(Seqlist* sqa, Seqlist* sqb, Seqlist* sqc)
{
    
    
	if (sqa == NULL || sqb == NULL || sqc == NULL)
		return;

	sqc->all_size = sqc->cur_size = sqa->cur_size + sqb->cur_size;
	sqc->data = (ElemType*)malloc(sizeof(ElemType) * sqc->all_size);
	memset(sqc->data, 0, sizeof(ElemType) * sqc->all_size);
	//pc指向sqc的第一个元素
	ElemType* pc = sqc->data;
	
	
	ElemType* pa_head = sqa->data;	//pa指向sqa的第一个元素的地址
	ElemType* pb_head = sqb->data;	//pb指向sqb的第一个元素的地址
	
	//pa指向sqa的最后一个元素的地址
	//pb指向sqb的最后一个元素的地址
	ElemType* pa_last = sqa->data + sqa->cur_size - 1;
	ElemType* pb_last = sqb->data + sqb->cur_size - 1;

	while (pa_head <= pa_last && sqb->data <= pb_last)
	{
    
    
		if (*pa_head < *pb_head)
		{
    
    
			*pc++ = *pa_head++;
		}
		else
		{
    
    
			*pc++ = *pb_head++;
		}
	}

	//确保所有元素都放入sqc中

	//sqa没走完,sqb走完
	while (pa_head <= pa_last) 
	{
    
    
		*pc++ = *pa_head++;
	}
	//sqb没走完,sqa走完
	while (pb_head <= pb_last) 
	{
    
    
		*pc++ = *pb_head++;
	}
}

测试代码:

void Test02()
{
    
    
	int arr[] = {
    
    1, 3, 5, 7, 9, 11};
	int brr[] = {
    
    2, 4, 6, 8, 10, 12};
	int len_a = sizeof(arr) / sizeof(arr[0]);
	int len_b = sizeof(brr) / sizeof(brr[0]);


	Seqlist sqa;	//顺序表a
	Seqlist sqb;	//顺序表b
	Seqlist sqc;	//顺序表c

	//初始化sqa 和 sqb
	Init_Seqlist(&sqa);
	Init_Seqlist(&sqb);
	for (int i = 0; i < len_a; i++)
	{
    
    
		Insert(&sqa, arr[i], i);		
	}
	for (int i = 0; i < len_a; i++)
	{
    
    
		Insert(&sqb, brr[i], i);
	}
	ShowSeqlist(&sqa);
	ShowSeqlist(&sqb);

	MergeSqlist(&sqa, &sqb, &sqc);
	
	ShowSeqlist(&sqc);

	FreeSeqList(&sqa);
	FreeSeqList(&sqb);
	FreeSeqList(&sqc);


}

int main()
{
    
    
	Test02();
	return 0;
}

测试结果:
在这里插入图片描述
总结:
注意使用指针访问元素时,不要使用sq->data形式的访问;
注意防止内存泄露;

猜你喜欢

转载自blog.csdn.net/xiaoxiaoguailou/article/details/120786280