题目介绍:
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−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>
typedef struct LinkNode *link;
struct LinkNode{
int data;
link next;
};
void Init (link a);//初始化
void FullInsert(link a);//完成整体
void Insert(link*,int);//完成单个输入 并更新尾结点
link Combine(link a, link b);//组合返回头结点
void FreeNode(link a);
void Show(link a);
int main()
{
link s1 = (link)malloc(sizeof(struct LinkNode));
link s2 = (link)malloc(sizeof(struct LinkNode));//两个空结点作头结点
link s3;
Init(s1);
Init(s2);
FullInsert(s1);
FullInsert(s2);
s3 = Combine(s1,s2);
Show(s3);
free(s1);
free(s2);
FreeNode(s3);
return 0;
}
void Init (link a)
{
a->data = 0;
a->next = NULL;
}
void FullInsert(link a)
{
int i;
link rear = a;
scanf("%d",&i);
while(i != -1){
Insert(&rear,i);
scanf("%d",&i);
}
}
void Insert(link *rear, int x)
{
link temp = (link)malloc(sizeof(struct LinkNode));
temp->data = x;
temp->next = NULL;
(*rear)->next = temp;
*rear = temp;
}
link Combine(link a, link b)
{
link pr = (link)malloc(sizeof(struct LinkNode));
link head = pr;
a = a->next;
b = b->next;
while(a && b){
if(b->data > a->data){
pr->next = a;
a = a->next;
}
else{
pr->next = b;
b = b->next;
}
pr = pr->next;
}
if(a) pr->next = a;
if(b) pr->next = b;
if(pr == head) return NULL;
pr = head;
head = head->next;
free(pr);
return head;
}
void FreeNode(link a)
{
link pr;
while(a){
pr = a;
a = a->next;
free(pr);
}
}
void Show(link a)
{
if(!a) { printf("NULL"); return;}//一定要return 之前没写return有错误找不出来
while(a->next != NULL){
printf("%d ", a->data);
a = a->next;
}
printf("%d", a->data);//最后一个数后面没有空格 不然会格式错误
}