数据结构实验之链表五:单链表的拆分
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。
Input
第一行输入整数N;;
第二行依次输入N个整数。Output
第一行分别输出偶数链表与奇数链表的元素个数;
第二行依次输出偶数子链表的所有数据;
第三行依次输出奇数子链表的所有数据。Sample Input
10 1 3 22 8 15 999 9 44 6 1001Sample Output
4 6 22 8 44 6 1 3 15 999 9 1001Hint
不得使用数组!
Source
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
}*head1, *head2, *head;
struct node *creat(int n)
{
int i;
struct node *t, *p, *head;
head = (struct node*)malloc(sizeof(struct node));
head -> next =NULL; t = head;
for(i = 0; i < n; i++)
{
p = (struct node*)malloc(sizeof(struct node));
scanf("%d", &p->data);p->next = NULL;
t ->next = p;t = p;
}
return head;
};
void show(struct node *head)
{
head=head->next;
while(head)
{
if(head->next!=NULL)
printf("%d ",head->data);
else
printf("%d\n",head->data);
head=head->next;
}
}
int sum1 = 0, sum2 = 0;
void change(struct node*head)
{
head1 = (struct node*)malloc(sizeof(struct node));
head2 = (struct node*)malloc(sizeof(struct node));
struct node *p1,*p2, *t;p1=head1;p2 = head2;t = head->next;
while(t!=NULL)
{
if(t->data%2==0)
{
p1->next=t;p1=t;t=t->next;sum1++;
}
else
{
p2->next=t;p2=t;t=t->next;sum2++;
}
}p2->next=NULL;p1->next=NULL;
};
int main()
{
int n;
scanf("%d", &n);
head=creat(n);change(head);
printf("%d %d\n", sum1, sum2);
show(head1);show(head2);
return 0;
}