核心算法:
void Classify(LinkList LA,LinkList LB,LinkList LC){//LA为原表,LB,LC为已经初始化的单链表头结点
Node *pa,*pb,*pc;
Node *p=LA->next;//原链表检测指针
pa=LA;
pb=LB;
pc=LC;
while(p!=NULL){
if(p->data>='0'&&p->data<='9'){
pa->next=p;
pa=p;
}else if(p->data>='a'&&p->data<='z'||p->data>='A'&&p->data<='Z'){
pb->next=p;
pb=p;
}else{
pc->next=p;
pc=p;
}
p=p->next;
}
pa->next=LA;
pb->next=LB;
pc->next=LC;//将头和尾链接起来,形成循环链表
}
完整代码
#include <stdio.h> #include <stdlib.h> typedef struct Node { char data; struct Node *next; }Node,*LinkList;//*LinkList为结构体指针类型 InitList(LinkList *L){//单链表初始化 (*L)=(LinkList)malloc(sizeof(Node)); (*L)->next=NULL; } void CreateFromTail(LinkList L){ Node *r,*s; int flag=1; r=L; char c; while(flag){ c=getchar(); if(c!='$'){//以$结束 s=(LinkList)malloc(sizeof(Node)); s->data=c; r->next=s; r=s; }else{ flag=0; r->next=NULL; } } } void OutputLinkList1(LinkList L){//输出单链表元素 Node *p; p=L->next; while(p!=NULL){ printf("%c->",p->data); p=p->next; } printf("NULL\n"); } void OutputLinkList(LinkList L){//输出循环链表的元素 Node *p; p=L->next; while(p!=L){//判断条件和前者不同 printf("%c->",p->data); p=p->next; } printf("NULL\n"); } void Classify(LinkList LA,LinkList LB,LinkList LC){ Node *pa,*pb,*pc; Node *p=LA->next;//原链表检测指针 pa=LA; pb=LB; pc=LC; while(p!=NULL){ if(p->data>='0'&&p->data<='9'){ pa->next=p; pa=p; }else if(p->data>='a'&&p->data<='z'||p->data>='A'&&p->data<='Z'){ pb->next=p; pb=p; }else{ pc->next=p; pc=p; } p=p->next; } pa->next=LA; pb->next=LB; pc->next=LC; } void main(){ LinkList LA,LB,LC; InitList(&LA); InitList(&LB); InitList(&LC); printf("输入字符,以$结束。\n"); CreateFromTail(LA); OutputLinkList1(LA);//此时LA为单链表 Classify(LA,LB,LC);//LA,LB,LC为循环链表 OutputLinkList(LA); OutputLinkList(LB); OutputLinkList(LC); }
结果示例