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形式的访问;
注意防止内存泄露;