数据结构实验之链表五:单链表的拆分
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 <stdio.h>
#include <stdlib.h>typedef struct LNode
{
LNode *next;
int data;
} LNode,*linklist;
linklist CreateList(linklist L,int h){
LNode *p,*q,*tail; int i;
L=(linklist)malloc(sizeof(LNode));
L->next=NULL;
tail=L;
for(i=0;i<h;i++){
p=(linklist )malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=NULL;
tail->next=p;
tail=p;
}
return L;
}
linklist split(LNode *L1,LNode *L2,LNode *L3,int &H2,int &H3)
{
H2=0;H3=0;
linklist p1,q1,tail2,p2,tail3,p3;
p1=L1->next;
tail2=L2;
tail3=L3;
while(p1!=NULL){
if(p1->data%2){ //判断奇偶后把节点放在各自的新表后
q1=p1->next; //
tail3->next=p1; //
p1->next=NULL; //
tail3=tail3->next;
p1=q1;
H3++; //记录新表长度
}else
{
q1=p1->next;
tail2->next=p1;
p1->next=NULL;
tail2=tail2->next;
p1=q1;
H2++;
}
}
return L2,L3;
}
int main()
{
int n,h2,h3;
linklist l1,l3,l2,p2,p3;
scanf("%d",&n);
l1=CreateList(l1,n);
l2=(linklist)malloc(sizeof(LNode));
l3=(linklist)malloc(sizeof(LNode));
split(l1,l2,l3,h2,h3);
p2=l2->next;
p3=l3->next;
printf("%d %d\n",h2,h3);
while(p2!=NULL){
if(p2->next!=NULL) printf("%d ",p2->data);
else printf("%d\n",p2->data);
p2=p2->next;
}
while(p3!=NULL) {
if(p3->next!=NULL) printf("%d ",p3->data);
else printf("%d",p3->data);
p3=p3->next;
}
}