zoukankan      html  css  js  c++  java
  • 两个有序链表序列的合并

    7-51 两个有序链表序列的合并(20 分)

    已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。

    输入格式:

    输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用1表示序列的结尾(1不属于这个序列)。数字用空格间隔。

    输出格式:

    在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

    输入样例:

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

    输出样例:

    1 2 3 4 5 6 8 10
    
    作者: DS课程组
    单位: 浙江大学
    时间限制: 1500ms
    内存限制: 128MB
     
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 typedef struct LNode{
     5     int data;
     6     struct LNode *next;
     7 }LNode,*LinkList;
     8 
     9 void init(LinkList &L);
    10 void read(LinkList &L);
    11 void merge(LinkList La,LinkList Lb,LinkList &Lc);
    12 void print(LinkList L);
    13 
    14 int main(){
    15     LinkList la,lb,lc;
    16     init(la);
    17     init(lb);
    18     init(lc);
    19     read(la);
    20     read(lb);
    21     merge(la,lb,lc);
    22     print(lc);
    23     return 0;
    24 }
    25 
    26 
    27 void init(LinkList &L){
    28     L=(LinkList)malloc(sizeof(LNode));
    29     L->next = NULL;
    30 }
    31 void read(LinkList &L){
    32     LinkList p,tem;
    33     int e;
    34     tem=L;
    35     
    36     scanf("%d",&e);
    37     while(e>0){
    38         p=(LinkList)malloc(sizeof(LNode));
    39         p->data=e;
    40         p->next=NULL;
    41         tem->next=p;
    42         tem=p;
    43         scanf("%d",&e);
    44     }
    45 }
    46 
    47 void print(LinkList L){
    48     LinkList p=L->next;
    49     if(!p){
    50         printf("NULL");
    51     }
    52     else{
    53         printf("%d",p->data);
    54         p=p->next;
    55         while(p){
    56             printf(" %d",p->data);
    57             p=p->next;
    58         }
    59     }
    60 }
    61 
    62 void merge(LinkList La,LinkList Lb,LinkList &Lc){
    63     LinkList pa,pb,pc;
    64     pa=La->next;pb=Lb->next;
    65     Lc=pc=La;
    66     while(pa&&pb){
    67         if(pa->data<=pb->data){
    68             pc->next=pa;
    69             pc=pa;
    70             pa=pa->next;
    71         }
    72         else{
    73             pc->next=pb;
    74             pc=pb;
    75             pb=pb->next;
    76         }
    77     }
    78     pc->next=pa?pa:pb;
    79     free(Lb);
    80 }

    总结:

    这一题是第一次体验运用刚学的数据结构来刷算法题,平时的题目只是要求我们做出特定功能的算法的函数就行,而OJ题需要我们写出能运行的代码,就需要有 main函数、数据结构定义,函数声明及定义,缺一不可。

    这一题需要注意的地方是‘read函数和输出格式’,其他诸如初始化操作、链表合并操作都是约定俗成的。read函数需要一次性读入所有值放到链表中,并遇到-1停止,因为这一题输入的都是正整数,就可以通过是否>0来确定是否输入完毕,该函数中循环的地方还要格外注意。输出格式问题是,若为空,输出NULL,所以单独列出这种可能性的操作;若不为空,合并后的链表各结点的值需用空格隔开,但最后一个元素后面没有空格,我的方法是先单独输出第一个结点的值,再按“空格+值”的格式输出。

  • 相关阅读:
    linux 学习(二)防火墙
    linux学习(一)开始
    ajax和sap以及网络安全
    仿苹果导航菜单js问题
    基本类型和引用类型调用是的区别(Object.create)
    箴言
    思维的宽度
    笔记
    循环传值_闭包
    一个问题的解法(兔子三个月之后每月都生兔子的问题)
  • 原文地址:https://www.cnblogs.com/cinzano/p/7739413.html
Copyright © 2011-2022 走看看