//10.8 有顺序表A 和B, 其表中元素均按由小到大的顺序排列。
//编写一个算法将他们合并成一个顺序表C, 并且要求表中的元素也按由小到大的顺序排列
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
typedef struct
{
int data[MAXSIZE]; //存储顺序表中的元素
int len; //顺序表的表长
}SeqList; //顺序表类型
SeqList *Init_SeqList() //顺序表初始化
{
SeqList *L;
L = (SeqList *)malloc(sizeof(SeqList));
L->len = 0;
return L; //返回指向顺序表的指针L
}
void CreateList(SeqList **L) //生成顺序表
{
int i, n;
printf("Input length of List: ");
scanf("%d", &n);
printf("Input element of List:\n");
for (i = 1; i <= n; i++)
{
scanf("%d", &(*L)->data[i]);
}
(*L)->len = n;
}
void Merge(SeqList *A, SeqList *B, SeqList **C)
{ //将两个升序的顺序表A和B合并为一个升序的顺序表C
int i = 1, j = 1, k = 1;
if (A->len + B->len > MAXSIZE)
{
printf("Error!\n");
exit(1);
}
*C = (SeqList *)malloc(sizeof(SeqList));
while (i <= A->len && j <= B->len)
{
if (A->data[i] < B->data[j])
{
(*C)->data[k++] = A->data[i++];
}
else
{
(*C)->data[k++] = B->data[j++];
}
}
while (i <= A->len) //当表A未复制完
{
(*C)->data[k++] = A->data[i];
}
while (j <= B->data[j]) //当表B未复制完
{
(*C)->data[k++] = B->data[j++];
}
(*C)->len = k - 1; //存储表长
}
void print(SeqList *L) //输出顺序表
{
int i;
for (i = 1; i <= L->len; i++)
{
printf("%4d", L->data[i]);
}
printf("\n");
}
int main()
{
SeqList *A, *B, *C;
A = Init_SeqList(); //顺序表A初始化
printf("Creat List A: ");
CreateList(&A); //生成顺序表A
printf("Output list A:\n");
print(A); //输出顺序表A
B = Init_SeqList(); //顺序表B初始化
printf("Creat List B:\n");
CreateList(&B); //生成顺序表B
printf("Output list B:\n");
print(B); //输出顺序表B
C = Init_SeqList(); //顺序表C初始化
printf("Merge list A and B:\n");
Merge(A, B, &C); //将两个升序表A和B合并为一个升序表C
printf("Output list C:\n");
print(C); //输出合并后的顺序表C
return 0;
}
10.8合并顺序表
最新推荐文章于 2022-11-22 22:00:02 发布