数据结构实验之链表五:单链表的拆分
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
/*************************************
先尾插法建一个表head,然后建head1 和 head2
两个空表,再然后从左到右遍历head偶数存于head1
奇数存于head2
**************************************/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data ;
struct node *next ;
}NODE ;
NODE *head1 , *head2 ;
NODE *creat(int n)
{
int i;
NODE *head , *p ,*q ;
head = (NODE*)malloc(sizeof(NODE)) ;
head -> next = NULL ;
q = head ;
for(i=0;i<n;i++)
{
p = (NODE*)malloc(sizeof(NODE)) ;
p->next = NULL ;
scanf("%d",&p->data) ;
q -> next = p;
q =p ;
}
return head ;
}
void bl(NODE*head)
{
NODE * p ,*t1,*t2 ;
p = head -> next ;
int i , j ;
i =0 ; j = 0 ;
head1 = (NODE*)malloc(sizeof(NODE)) ;
t1 = head1 ;
head2 = (NODE*)malloc(sizeof(NODE));
t2 = head2 ;
while(p)
{
if(p->data%2==0)
{
t1->next = p ;
t1=t1->next ;
i++ ;
}
else
{
t2->next = p ;
t2 = t2->next ;
j++ ;
}
p = p-> next ;
}
t2->next = NULL ;
t1 ->next = NULL ;
printf("%d %d\n",i,j) ;
}
void show(NODE *head)
{
NODE *p ;
p = head -> next ;
while(p)
{
printf("%d",p->data) ;
if(p->next == NULL )
printf("\n") ;
else
printf(" ") ;
p = p->next ;
}
}
int main()
{
int n ;
NODE *head ;
scanf("%d",&n) ;
head = creat(n) ;
bl(head) ;
show(head1) ;
show(head2) ;
return 0 ;
}
/***************************************************
Result: Accepted
Take time: 0ms
Take Memory: 152KB
Submit time: 2019-03-03 19:37:41
****************************************************/