#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node
{
int data;//数据域
struct node *next;//指针域
}slink;//单链表类型名
slink *createslink(int n)
{
int i;
slink *head,*p,*s;
p=head=(slink *)malloc(sizeof(slink));
for(i=1;i<=n;i++)
{
s=(slink *)malloc(sizeof(slink));
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=NULL;
return head;
}
void turn(slink *head) //单链表的逆置
{
slink *p,*q;
p=head->next;
head->next=NULL; //置一个空链表
while(p!=NULL)
{
q=p->next; //保存插入点的后继结点指针
p->next=head->next;
head->next=p;
p=q;
}
}
slink * divide(slink *head)//从链表中分出奇偶数
{
slink *odd,*p,*q,*r;
odd=(slink *)malloc(sizeof(slink));
r=head->next;//r用于遍历整个链表
p=head;//head作为奇数链表的头指针,p用来连接
q=odd;//odd作为偶数链表的头指针,q用来连接
while(r!=NULL)
{
if(r->data%2!=0) //奇数
{
p->next=r;
p=r;
}
else //偶数
{
q->next=r;
q=r;
}
r=r->next;
}
p->next=NULL;
q->next=NULL;
return odd;
}
void print(slink *head)
{
slink *p;
p=head->next;
while(p)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
slink *head,*odd;
head=createslink(8);
printf("原链表为:");
print(head);
turn(head);
printf("逆置后链表:");
print(head);
odd=divide(head);
printf("偶数链表:");
print(odd);
printf("奇数链表:");
print(head);
return 0;
}
运行结果: