7-1 两个有序链表序列的合并 (20 分)(用线性表实现)(PTA)

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−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