已知兩個非降序鏈表序列S1與S2,設計函數構造出S1與S2合並后的新的非降序鏈表S3。
輸入格式:
輸入分兩行,分別在每行給出由若干個正整數構成的非降序序列,用−表示序列的結尾(−不屬於這個序列)。數字用空格間隔。
輸出格式:
在一行中輸出合並后新的非降序鏈表,數字間用空格分開,結尾不能有多余空格;若新鏈表為空,輸出NULL。
輸入樣例:
1 3 5 -1 2 4 6 8 10 -1
輸出樣例:
1 2 3 4 5 6 8 10
第一次做:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函數狀態碼定義
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType; //假設線性表中的元素均為整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //循環單鏈表類型定義與單鏈表定義相同,區別在尾節點next取值
LinkList Plus(LinkList l1, LinkList l2)
{
LinkList L;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
LNode *p = L;
LNode *p1, *p2;
p1 = l1->next;
p2 = l2->next;
while(p1!=NULL&&p2!=NULL){
if(p1->data<=p2->data){
p->next = p1;
p = p1;
p1 = p1->next;
}
else{
p->next = p2;
p = p2;
p2 = p2->next;
}
}
if(p1 == NULL){
while(p2!=NULL){
p->next = p2;
p = p2;
p2 = p2->next;
}
}
else{
while(p1!=NULL){
p->next = p1;
p = p1;
p1 = p1->next;
}
}
return L;
}
int main()
{
LinkList L1;
LinkList L2;
LinkList L;
LNode *p, *tem;
L1 = (LNode *)malloc(sizeof(LNode));
L2 = (LNode *)malloc(sizeof(LNode));
p = (LNode *)malloc(sizeof(LNode));
L1->next = NULL;
L2->next = NULL;
int temp;
p = L1;
while(scanf("%d", &temp)!=EOF){
if(temp<0)
break;
else{
tem = (LNode *)malloc(sizeof(LNode));
tem->data = temp;
tem->next = NULL;
p->next = tem;
p = tem;
}
}
p = L2;
while(scanf("%d", &temp)!=EOF){
if(temp<0)
break;
else{
tem = (LNode *)malloc(sizeof(LNode));
tem->data = temp;
tem->next = NULL;
p->next = tem;
p = tem;
}
}
L = Plus(L1, L2);
p = L->next;
if(p == NULL){
printf("NULL");
}
else
while(p!=NULL){
if(p->next != NULL){
printf("%d ", p->data);
}
else
printf("%d", p->data);
p = p->next;
}
}
1
第二次做:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, *List;
void CreatList(List &L)
{
LNode *p, *temp;
L = (LNode* )malloc(sizeof(LNode));
p = L;
int t;
while(scanf("%d", &t)!=EOF){
if(t == -1)
return ;
temp = (LNode*)malloc(sizeof(LNode));
temp->next = NULL;
temp->data = t;
p->next = temp;
p = temp;
}
}
List Merge(List L1, List L2)//歸並排序
{
List L;
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
LNode *p = L;
L1 = L1->next;
L2 = L2->next;
while(L1!=NULL && L2!=NULL){
if(L1->data <= L2->data){
p->next = L1;
p = L1;
L1 = L1->next;
}
else{
p->next = L2;
p = L2;
L2 = L2->next;
}
}
if(L1 != NULL)
p->next = L1;
if(L2 != NULL)
p->next = L2;
return L;
}
void CoutList(List L)
{
if(L->next == NULL){
printf("NULL");
return ;
}
L = L->next;
while(L != NULL){
if(L->next != NULL)
printf("%d ", L->data);
else
printf("%d", L->data);
L = L->next;
}
}
int main()
{
List L1, L2, L;
CreatList(L1);
CreatList(L2);
L = Merge(L1, L2);
CoutList(L);
}
