【SDUT】【鏈表】2120 - 數據結構實驗之鏈表五:單鏈表的拆分

Problem Description

輸入N個整數順序創建一個單鏈表,將該單鏈表拆分紅兩個子鏈表,第一個子鏈表存放了全部的偶數,第二個子鏈表存放了全部的奇數。兩個子鏈表中數據的相對次序與原鏈表一致。

Input

第一行輸入整數N;;
第二行依次輸入N個整數。

Output

第一行分別輸出偶數鏈表與奇數鏈表的元素個數;
第二行依次輸出偶數子鏈表的全部數據;
第三行依次輸出奇數子鏈表的全部數據。

Sample Input

10
1 3 22 8 15 999 9 44 6 1001

Sample Output

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

Hint

不得使用數組!

Source

 

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 struct node
 9 {
10     int data;
11     struct node *next;
12 };
13 
14 int cnt1,cnt2;
15 
16 //申請空間
17 struct node *arr_mal(struct node *p)
18 {
19     p = (struct node *)malloc(sizeof(struct node));
20     return p;
21 }
22 
23 //建立鏈表
24 void arr_create(struct node *head,int n)
25 {
26     struct node *p=NULL,*tail=NULL;
27     tail = head;
28     while(n--)
29     {
30         p = arr_mal(p);
31         scanf("%d",&p ->data);
32         tail ->next = p;
33         tail = tail ->next;
34     }
35 }
36 
37 //輸出鏈表
38 void arr_prin(struct node *head)
39 {
40     struct node *p=NULL;
41     p = head ->next;
42     if(p != NULL)
43     {
44         printf("%d",p ->data);
45         p = p ->next;
46     }
47     while(p != NULL)
48     {
49         printf(" %d",p ->data);
50         p = p ->next;
51     }
52     printf("\n");
53 }
54 
55 //拆分
56 void arr_split(struct node *head1,struct node *head2)
57 {
58 
59     struct node *p1=NULL,*p2=NULL,*tail=NULL;
60     p1 = head1;
61     p2 = head2;
62     while(p1 ->next != NULL)
63     {
64         if(p1 ->next->data%2)
65         {
66             p1 = p1 ->next;
67             cnt1++;
68         }
69         else
70         {
71             tail = p1 ->next;
72             p1 ->next = tail ->next;
73             tail ->next = NULL;
74             p2 ->next = tail;
75             p2 = p2 ->next;
76             cnt2++;
77         }
78     }
79 }
80 
81 int main()
82 {
83     int n;
84     cnt1=cnt2=0;
85     struct node *head1=NULL,*head2=NULL;
86     head1 = arr_mal(head1);
87     head2 = arr_mal(head2);
88     scanf("%d",&n);
89     arr_create(head1,n);
90     arr_split(head1,head2);
91     printf("%d %d\n",cnt2,cnt1);
92     arr_prin(head2);
93     arr_prin(head1);
94     return 0;
95 }
相關文章
相關標籤/搜索