数据结构实验之链表五:单链表的拆分
题目描述
输入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> #include<stdio.h> #include<stdlib.h> using namespace std; struct node { int data; node *next; }; struct node*creat(int n) { struct node*head,*p,*tail; int i; head=(struct node*)malloc(sizeof(struct node)); head->next=NULL; tail=head; for(i=0; i<n; i++) { p=(struct node*)malloc(sizeof(struct node)); scanf("%d",&p->data); p->next=NULL; tail->next=p; tail=p; } return (head); } struct node*split(struct node*head1) { struct node*head2,*p,*q; int n,m; n=0;m=0; head2=(struct node*)malloc(sizeof(struct node)); head2->next=NULL; p=head1->next; head1->next=NULL; q=p->next; while(p!=NULL) { if(p->data%2==0) { p->next=head1->next; head1->next=p; n++; } else { p->next=head2->next; head2->next=p; m++; } p=q; if(q!=NULL) q=q->next; } cout<<n<<" "<<m<<endl; return (head2); }; void reverse(struct node*head) { struct node*p,*q; p=head->next; head->next=NULL; q=p->next; while(p!=NULL) { p->next=head->next; head->next=p; p=q; if(q!=NULL) q=q->next; } } int main() { int x; cin>>x; node *head,*p,*head2; head=creat(x); head2=split(head); reverse(head); reverse(head2); for(p=head->next; p->next!=NULL; p=p->next) { cout<<p->data<<" "; } cout<<p->data<<endl; for(p=head2->next; p->next!=NULL; p=p->next) { cout<<p->data<<" "; } cout<<p->data<<endl; return 0; }