7-1 Combinación de dos secuencias de listas enlazadas ordenadas (20 puntos) (implementado con lista lineal) (PTA)

Dadas dos secuencias de listas enlazadas no descendentes S1 y S2, la función de diseño construye una nueva lista enlazada no descendente S3 después de fusionar S1 y S2.

Formato de entrada:

La entrada se divide en dos líneas. Cada línea da una secuencia no descendente compuesta por varios números enteros positivos. Utilice −1 para indicar el final de la secuencia (−1 no pertenece a esta secuencia). Los números están separados por espacios.

Formato de salida:

Imprima la nueva lista vinculada no descendente después de fusionarla en una línea, separada por espacios entre números y sin espacios adicionales al final; si la nueva lista vinculada está vacía, salida NULL.

Muestra de entrada:

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

Salida de muestra:

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;
}

Supongo que te gusta

Origin blog.csdn.net/hx_521/article/details/88902193
Recomendado
Clasificación