//单链表的拆分# include# include 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; }