C语言数据结构之单链表的拆分

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

posted @ 2015-09-23 22:41  Joe.Smith  阅读(1343)  评论(0编辑  收藏  举报