今天是数据结构实验的第一一节课。
任务描述
给定两个按照升序排列的有序数组,请把它们合成一个升序数组并输出。
编程要求
根据提示,在右侧编辑器补充代码,完成合并有序数组。
测试说明
输入说明: 第一行为第一个有序数组的长度,正整数 n
,n<=20
; 第二行为第一个有序数组的 n
个数字,用空格隔开; 第三行为第二个有序数组的长度,正整数m
,m<=20
; 第四行为第二个有序数组的 m
个数字,用空格隔开。 输出说明: 输出合并后的数组,每个数字占一行。
平台会对你编写的代码进行测试:
测试输入:
3
1 3 7
5
2 4 6 8 10
预期输出:
1
2
3
4
6
7
8
10
我先是用算法课上学的归并排序算法尝试了一下,接着尝试用线性表实现。其实我老感觉一维数组和线性表差不多,线性表到底优越在哪里啊?
#include <stdio.h>
#define MAXSIZE 1000
typedef struct
{
int data[40];
int last;
} seqlist;
void merge(seqlist *L1, seqlist *L2);
int main()
{
int m, n;
seqlist L1, L2, L;
L1.last = 0;
L2.last = 0;
L.last = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &L1.data[i]);
L1.last++;
}
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
scanf("%d", &L2.data[i]);
L2.last++;
}
merge(&L1, &L2);
for (int i = 0; i < L1.last; i++)
{
printf("%d\n", L1.data[i]);
}
return 0;
}
void merge(seqlist *L1, seqlist *L2)
{
seqlist L;
L.last = L1->last + L2->last;
int i = 0, j = 0, k = 0;
while (j < L1->last && k < L2->last)
{
if (L1->data[j] < L2->data[k])
{
L.data[i] = L1->data[j];
j++;
}
else
{
L.data[i] = L2->data[k];
k++;
}
i++;
}
while (j < L1->last)
{
L.data[i] = L1->data[j];
i++;
j++;
}
while (k < L2->last)
{
L.data[i] = L2->data[k];
i++;
k++;
}
for (int m = 0; m < L.last; m++)
{
L1->data[m] = L.data[m];
}
L1->last = L.last;
}
问题主要出在几个点上:
seqlist L1, L2, L;
L1.last = 0;
L2.last = 0;
L.last = 0;
没错,上一篇文章我才说了要对线性表的长度初始化定义,这次又忘了。
void merge(seqlist *L1, seqlist *L2)
{
seqlist L;
……
}
我最开始是用的指针定义seqlist *L;但是却没有为指针分配内存空间,所以改成了直接定义一个线性表结构体。那我这脑袋瓜又有问题了,为什么在merge函数里面的定义就不用分配空间呢?是因为形参和实参的区别吗?那为什么有一定要分配内存空间呢?像int、float、char这样的变量声明也没有给变量分配空间啊……
以下是数据结构实验期末复习的简易代码,用一维数组实现:
#include <stdio.h>
int seq1[20];
int seq2[20];
int seq3[40];
int m, n;
void readdata();
void merge();
void printseq3();
int main(){
readdata();
merge();
printseq3();
return 0;
}
void readdata(){
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &seq1[i]);
}
scanf("%d", &m);
for (int i = 0; i < m; i++){
scanf("%d", &seq2[i]);
}
}
void merge(){
int i = 0, j = 0, k = 0;
while(i < n && j < m){
if (seq1[i] < seq2[j]){
seq3[k] = seq1[i];
i++;
k++;
}
else{
seq3[k] = seq2[j];
j++;
k++;
}
}
while (i < n){
seq3[k] = seq1[i];
i++;
k++;
}
while (j < m){
seq3[k] = seq2[j];
k++;
j++;
}
return;
}
void printseq3(){
for (int i = 0; i < m+n-1; i++){
printf("%d\n", seq3[i]);
}
printf("%d", seq3[m+n-1]);
}