题目描述
已知L为设有头结点的单链表中第一个结点的指针,每个结点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其他字符。编写程序构造三个以带头结点的单循环链表表示的线性表,使每个表中只含同一类字符,最后输出链表中的信息。
输入
链表中的数据元素;
输出
第一行为数字链表中的信息; 第二行为英文字母字符链表中的信息; 第三行为其它字符链表中的信息。
样例输入
abc123@$12
样例输出
12312
abc
@$
#include<malloc.h>
#include<stdio.h>
#include<string.h>
#define MaxSize 10000
typedef struct L
{
char data;
struct L *next;
}List;
void init(List*&L)
{
L=(List*)malloc(sizeof(List));
L->next=NULL;
}
bool Empty(List*L)
{
return (L->next==NULL);
}
void Classify(char a[],List*&L1,List*&L2,List*&L3)
{
int len=strlen(a);
List*r1=L1,*r2=L2,*r3=L3;//尾插法
List*s1,*s2,*s3;
for(int i=0;i<len;i++)
{
if(a[i]>='0'&&a[i]<='9')
{//如果是数字,尾插法建L1链表
s1=(List*)malloc(sizeof(List));
s1->data=a[i];
r1->next=s1;
r1=s1;
}else
if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z')
{//如果是字母,尾插法建L2链表
s2=(List*)malloc(sizeof(List));
s2->data=a[i];
r2->next=s2;
r2=s2;
}else
{//如果是其它字符,尾插法建L3链表
s3=(List*)malloc(sizeof(List));
s3->data=a[i];
r3->next=s3;
r3=s3;
}
}
r1->next=r2->next=r3->next=NULL;
}
void display(List*L1,List*L2,List*L3)
{
//把指针移动到首结点
//数字
while(!Empty(L1))
{
L1=L1->next;
printf("%c",L1->data);
}
if(!Empty(L2))//如果有字母,则输出换行符
printf("\n");
//本题中此句判断省略也可通过,下面字符的判断也一样
while(!Empty(L2))
{
L2=L2->next;
printf("%c",L2->data);
}
if(!Empty(L3))
printf("\n");
while(!Empty(L3))
{
L3=L3->next;
printf("%c",L3->data);
}
printf("\n");//换行符不能省
}
int main()
{
char a[MaxSize];//用字符数组代替L,简单点
scanf("%s",a);
List *L1,*L2,*L3;
//L1是数字链表
//L2是字母链表
//L3是字符链表
init(L1),init(L2),init(L3);//初始化
Classify(a,L1,L2,L3);//分类
display(L1,L2,L3);//打表
}