数据结构实验之链表五:单链表的拆分
Time Limit: 1000MS Memory limit: 65536K
题目描述
输入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
代码
#include <iostream> using namespace std; struct node { int data; struct node *next ; }; node *creat(int n) { int i; node * head, * p, * tail; head=new node; head->next =NULL; tail=head; for(i=1;i<=n;i++) { p=new node; cin>>p->data; p->next=NULL; tail->next=p; tail=p; } return head ; } struct node *split(struct node *head1) { struct node *head2,*tail1,*tail2,*p,*q; head2=new node; head2->next= NULL ; tail1 = head1 ; p = head1->next ; head1->next = NULL; tail2=head2 ; q=p->next ; while(p!=NULL) { if(p->data%2==0) { p->next=NULL ; tail1->next=p ; tail1=p ; } else { p->next=NULL ; tail2->next=p ; tail2=p ; } p=q ; if(q!=NULL) q=q->next ; } return(head2); } int main() { int n ; struct node *head1,*head2 ; cin>>n ; head1 = creat(n) ; struct node *s1,*s2,*h1,*h2 ; head2 = split(head1) ; h1=head1 ; h2=head2 ; s1=head1 ; s2=head2 ; int k=0, g=0 ; while(h1->next!=NULL) { k++ ; h1=h1->next ; } while(h2->next!=NULL) { g++ ; h2=h2->next ; } cout<<k<<" "<<g<<endl ; s1 = s1->next ; while(s1!=NULL) { if(s1->next==NULL) cout<<s1->data<<endl; else cout<<s1->data<<" "; s1=s1->next ; } s2 = s2->next ; while(s2!=NULL) { if(s2->next==NULL) cout<<s2->data<<endl ; else cout<<s2->data<<" "; s2=s2->next ; } return 0 ; }