7-1 2つの順序付けられたリンクリストシーケンスの組み合わせ(20ポイント)(線形リストで実装)(PTA)

2つの非降順リンクリストシーケンスS1とS2が与えられると、設計関数は、S1とS2がマージされた後、新しい非降順リンクリストS3を作成します。

入力フォーマット:

入力は2行に分割されます。各行は、いくつかの正の整数で構成される降順ではないシーケンスを示します。シーケンスの終わりを示すには、-1を使用します(-1はこのシーケンスに属しません)。番号はスペースで区切られます。

出力フォーマット:

1行にマージした後、番号間のスペースで区切り、最後に余分なスペースを入れずに、新しい非降順リンクリストを出力しますNULL新しいリンクリストが空の場合は、を出力します

入力サンプル:

1 3 5 -1
2 4 6 8 10 -1

サンプル出力:

1 2 3 4 5 6 8 10

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10000000//宏定义一个大小为一千万的内存空间。(我个人PTA上最大测试点为一千万)
typedef struct
{
    
    
	int *elem;
	int length;
} SqList;//定义线性表。
void InitList(SqList &l);
void InitList(SqList &l)
{
    
    
	l.elem = (int*)malloc(sizeof(int)*MAXSIZE);
	//或直接用l.elem=(int*)malloc(MAXSIZE);//因为elem为int型,所以前面用int;
	//关于malloc:申请空间;分配的大小是参数,返回值是指针。
	l.length = 0;
}//线性表的初始化。
int main()
{
    
    
	int i = 0, j = 0, k = 0, m = 0, n = 0, z = 0;
	SqList l1, l2, newl;
	InitList(l1);
	InitList(l2);
	InitList(newl);//传入函数体中,将线性表初始化。
	do {
    
    
		scanf("%d", &l1.elem[i]);
		i++; l1.length++;
	} while (l1.elem[i - 1] != -1);

	do {
    
    
		scanf("%d", &l2.elem[j]);
		j++; l2.length++;
	} while (l2.elem[j - 1] != -1);
//为线性表输入数据。
	for (k = 0; l1.elem[m] != -1 && l2.elem[n] != -1; k++)
	{
    
    
		if (l1.elem[m] > l2.elem[n])
		{
    
    
			newl.elem[k] = l2.elem[n];
			n++;
		}
		else
		{
    
    
			newl.elem[k] = l1.elem[m];
			m++;
		}
		newl.length++;
	}
	if (l1.elem[m] = -1)
	{
    
    
		while (l2.elem[n] != -1)
		{
    
    
			newl.elem[k] = l2.elem[n];
			n++; k++; newl.length++;
		}
	}//线性表的合并,必有其一先截止,所以将未截止的线性表中其余数据放入新表。
	else
	{
    
    
		while (l1.elem[m] != -1)
		{
    
    
			newl.elem[k] = l1.elem[n];
			m++; k++; newl.length++;
		}
	}
	if (k == 0)//当两个两表均为空时的判定。此判定可有多种方式,如newl.elem[0]==-1,newl.length==0;
	{
    
    
		printf("NULL");
		return 0;
	}
	for (z = 0; z < k; z++)
	{
    
    
		if (z != 0)printf(" ");
		printf("%d", newl.elem[z]);
	}//新表输出。

	return 0;
}

おすすめ

転載: blog.csdn.net/hx_521/article/details/88902193