• 数据结构实验之链表五:单链表的拆分


    题目描述

    输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。

    输入

    第一行输入整数N;;
    第二行依次输入N个整数。

    输出

    第一行分别输出偶数链表与奇数链表的元素个数;
    第二行依次输出偶数子链表的所有数据;
    第三行依次输出奇数子链表的所有数据。

    示例输入

    10
    1 3 22 8 15 999 9 44 6 1001

    示例输出

    4 6
    22 8 44 6 
    1 3 15 999 9 1001

    提示

    不得使用数组!

    来源

    View Code
     1 #include <stdio.h>
     2 #include <malloc.h>
     3 typedef struct node
     4 {
     5     int data;
     6     struct node *next ;
     7 }Node;
     8 Node *creat(int n)
     9 {
    10     int i;
    11     Node * head, * p, * tail;
    12     head=(Node*)malloc(sizeof(Node));
    13     head->next =NULL;
    14     tail=head;
    15     for(i=1;i<=n;i++)
    16     {
    17         p=(Node *)malloc(sizeof(Node));
    18         scanf("%d",&p->data);
    19         p->next=NULL;
    20         tail->next=p;
    21         tail=p;
    22     }
    23     return head ;
    24 }
    25 struct node *split(struct node *head1)
    26 {
    27     struct node *head2,*tail1,*tail2,*p,*q;
    28     head2=(struct node *)malloc(sizeof(struct node));
    29     head2->next= NULL ;
    30     tail1 = head1 ;
    31     p = head1->next ;
    32     head1->next =  NULL;
    33     tail2=head2 ;
    34     q=p->next ;
    35     while(p!=NULL)
    36     {
    37         if(p->data%2==0)
    38         {
    39             p->next=NULL ;
    40             tail1->next=p ;
    41             tail1=p ;
    42         }
    43         else
    44         {
    45             p->next=NULL ;
    46             tail2->next=p ;
    47             tail2=p ;
    48         }
    49         p=q ;
    50         if(q!=NULL)
    51             q=q->next ;
    52     }
    53     return(head2);
    54 }
    55 int main()
    56 {
    57   int n ;
    58   struct node *head1,*head2 ;
    59   scanf("%d",&n) ;
    60   head1 = creat(n) ;
    61   struct node *s1,*s2,*h1,*h2 ;
    62   head2 = split(head1) ;
    63   h1=head1 ;
    64   h2=head2 ;
    65   s1=head1 ;
    66   s2=head2 ;
    67   int k=0, g=0 ;
    68   while(h1->next!=NULL)
    69   {
    70       k++ ;
    71       h1=h1->next ;
    72   }
    73   while(h2->next!=NULL)
    74   {
    75       g++ ;
    76       h2=h2->next ;
    77   }
    78   printf("%d %d\n",k,g) ;
    79   s1 = s1->next ;
    80   while(s1!=NULL)
    81    {
    82      if(s1->next==NULL)
    83       printf("%d\n",s1->data) ;
    84      else
    85        printf("%d ",s1->data) ;
    86        s1=s1->next ;
    87    }
    88   s2 = s2->next ;
    89   while(s2!=NULL)
    90    {
    91      if(s2->next==NULL)
    92       printf("%d\n",s2->data) ;
    93      else
    94        printf("%d ",s2->data) ;
    95        s2=s2->next ;
    96    }
    97   return 0 ;
    98 }
  • 相关阅读:
    APB协议
    AHB总线协议(一)
    C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系
    深入理解C++内存管理机制
    c/c++内存机制(一)(转)
    与临时对象的斗争(下)
    与临时对象的斗争(上)ZZ
    C++异常处理解析: 异常的引发(throw), 捕获(try catch)、异常安全
    qt5信息提示框QMessageBox用法
    红黑树
  • 原文地址:https://www.cnblogs.com/yelan/p/2872076.html
Copyright © 2020-2023  润新知