//单链表的拆分
# include<stdio.h>
# include<malloc.h>
typedef struct LNode
{
char data; //每个结点中存储的数据为字符型
struct LNode *next; //指向后继结点
}LinkList;
void Create(LinkList *&L)
{
LinkList *s,*r;
L=(LinkList *)malloc(sizeof(LinkList));//创建头结点
L->next=NULL; //头结点的next域置空
r=L; //r始终指向终端结点,开始时指向头结点
printf("\n输入链表中的各元素(注意字母为单字符):\n");
while(1) {
s=(LinkList *)malloc(sizeof(LinkList)); //创建新结点
scanf("%c",&s->data); //输入新节点的数据
r->next=s; //将*s插入*r之后
r=s;
if(s->data=='\n') //若输入回车,则字符串的输入结束
break;
}
r->next=NULL; //终端结点next域置NULL
}
void Printf(LinkList *L)
{
LinkList *p=L->next;
while (p!=NULL)
{
printf("%c\t",p->data); //当指针p所指结点next域不为NULL时,将该结点的数据输出
p=p->next; //p指针向后移动
}
}
void Fun(LinkList *hd,LinkList *ha,LinkList *hb,LinkList *hc)
{
LinkList *p=hd->next,*ra,*rb,*rc; //定义三个指向链表结点的指针
ra=ha; //ra始终指向ha的末尾结点
rb=hb; //ra始终指向ha的末尾结点
rc=hc; //ra始终指向ha的末尾结点
while(p!=NULL) //当指针p所指结点的指针域不为NULL时,执行以下循环过程
{
if(p->data>='A'&&p->data<='Z'||p->data>='a'&&p->data<='z')//如果数据为字母类型
{
ra->next=p;ra=p; //将*p链接到ha单链表末尾
p=p->next; //p指针后移
}
else
{
if(p->data>='0'&&p->data<='9') //如果数据为数字类型
{
rb->next=p;rb=p;//将*p链接到ha单链表末尾
p=p->next; //p指针后移
}
else //数据为其它类型的情况
{
rc->next=p;
rc=p;//将*p链接到ha单链表末尾
p=p->next; //p指针后移
}
}
}
ra->next=NULL;
rb->next=NULL;
rc->next=NULL; //将三个新链表尾结点的next域置空
}
int main()
{
LinkList *hd,*ha,*hb,*hc; //定义四个头结点指针,*hd代表待拆分链表,*ha,*hb和*hc分别代表字母,数字和其它类型的链表
ha=(LinkList *)malloc(sizeof(LinkList));//创建ha头结点
hb=(LinkList *)malloc(sizeof(LinkList));//创建hb头结点
hc=(LinkList *)malloc(sizeof(LinkList));//创建hc头结点
int i; //定义整型数据i,用于判断是否终止本程序的运行
char m; //定义字符型数据m,存放输入i的值之后的'\n'
while(1) {
Create(hd); //调用建立单链表并输入数据的函数
Fun(hd,ha,hb,hc); //调用拆分链表的函数
printf("\n字母:"); //提示输出的链表中数据为字母类型
Printf(ha); //调用输出链表元素的函数,输出ha链表中的数据(字母类型)
printf("\n数字:"); //提示输出的链表中数据为数字类型
Printf(hb); //调用输出链表元素的函数,输出hb链表中的数据(数字类型)
printf("\n其它:"); //提示输出的链表中数据为其它类型
Printf(hc);
break;
}
//调用输出链表元素的函数,输出hc链表中的数据(其它类型)
return 0;
}
转载于:https://www.cnblogs.com/zhuhengjie/p/5966948.html