PTA-线性结构1 两个有序链表序列的合并

来源:互联网 发布:生命周期假说 知乎 编辑:程序博客网 时间:2024/05/16 12:19

本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

函数接口定义:

List Merge( List L1, List L2 );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node {    ElementType Data; /* 存储结点数据 */    PtrToNode   Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。

裁判测试程序样例:

#include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct Node *PtrToNode;struct Node {    ElementType Data;    PtrToNode   Next;};typedef PtrToNode List;List Read(); /* 细节在此不表 */void Print( List L ); /* 细节在此不表;空链表将输出NULL */List Merge( List L1, List L2 );int main(){    List L1, L2, L;    L1 = Read();    L2 = Read();    L = Merge(L1, L2);    Print(L);    Print(L1);    Print(L2);    return 0;}/* 你的代码将被嵌在这里 */

输入样例

3
1 3 5
5
2 4 6 8 10

输出样例:

1 2 3 4 5 6 8 10
NULL
NULL

#include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct Node *PtrToNode;struct Node {    ElementType Data;    PtrToNode   Next;};typedef PtrToNode List;List Read(); /* 细节在此不表 */void Print( List L ); /* 细节在此不表;空链表将输出NULL */List Merge( List L1, List L2 );int main(){    List L1, L2, L;    L1 = Read();    L2 = Read();    L = Merge(L1, L2);    Print(L);    Print(L1);    Print(L2);    return 0;}//初始化 List ListInit(){    List PtrL;    PtrL=(List)malloc(sizeof(struct Node));   //申请结点空间     if(PtrL==NULL){        printf("申请空间失败");            //判断是否有足够的空间     }    PtrL->Next=NULL;     return PtrL;}//尾插法建立单链表(带头结点) List ListCreate(int n){    List head;    head=ListInit();                    //初始化一个空链表    List r;     r = head;                           //r始终指向终端结点,开始时指向头结点       while(n--){        int m;        scanf("%d",&m);                      //读入数据         List p;        p=(List)malloc(sizeof(struct Node));   //申请新的结点空间        p->Data=m;                             //结点的数据域赋值         r->Next=p;                             //将结点插入到表头head-->|1|-->|2|-->NULL          r=p;    }    r->Next=NULL;    return head; } //读取数据 List Read(){    int n;    List Ptr;    scanf("%d",&n);    Ptr = ListCreate(n);    return Ptr;}//输出函数 void Print( List L ){    if(L->Next==NULL){        printf("NULL\n");    }else{        while(L->Next!=NULL)        {            List tmp = L->Next;            if(tmp->Next==NULL)                printf("%d\n",tmp->Data);            else                printf("%d ",tmp->Data);            L = tmp;        }    }}List Merge( List L1, List L2 ){    List L3 = (List)malloc(sizeof(struct Node));//申请结点空间     L3->Next = NULL;    //List L3 = ListInit();    List tail,tmp1,tmp2;     tail = L3;                                 //tail始终指向终端结点,开始时指向头结点    tmp1 = L1->Next;                           //L1,L2都带头结点     tmp2 = L2->Next;    while(tmp1&&tmp2)    {        if(tmp1->Data <= tmp2->Data){          //比较两个单链表中结点数据域大小             tail->Next = tmp1;            tail = tmp1;            tmp1 = tmp1->Next;        }else{            tail->Next = tmp2;            tail = tmp2;            tmp2 = tmp2->Next;        }    }    tail->Next = tmp1 ? tmp1 : tmp2;  //当tmp1不为空时,全接在tail后面,否则tmp2全接在tail后面     L1->Next = NULL;                  //L1,L2置空     L2->Next = NULL;    return L3;}

上面是整个程序的实现,但是题目只要求提交Merge函数就好了。

阅读全文
0 0
原创粉丝点击