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