数据结构实验之链表五:单链表的拆分
题目描述
输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。
输入
第一行输入整数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 }