NWPU DS_practice 头歌1-1 合并有序数组

今天是数据结构实验的第一一节课。

任务描述

给定两个按照升序排列的有序数组,请把它们合成一个升序数组并输出。

编程要求

根据提示,在右侧编辑器补充代码,完成合并有序数组。

测试说明

输入说明: 第一行为第一个有序数组的长度,正整数 nn<=20 ; 第二行为第一个有序数组的 n 个数字,用空格隔开; 第三行为第二个有序数组的长度,正整数mm<=20; 第四行为第二个有序数组的 m 个数字,用空格隔开。 输出说明: 输出合并后的数组,每个数字占一行。

平台会对你编写的代码进行测试:

测试输入:

  1. 3
  2. 1 3 7
  3. 5
  4. 2 4 6 8 10

预期输出:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 6
  6. 7
  7. 8
  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]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值