题目描述
已知L为设有头结点的单链表中第一个结点的指针,每个结点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其他字符。编写程序构造三个以带头结点的单循环链表表示的线性表,使每个表中只含同一类字符,最后输出链表中的信息。
输入
链表中的数据元素;
输出
第一行为数字链表中的信息; 第二行为英文字母字符链表中的信息; 第三行为其它字符链表中的信息。
样例输入
abc123@$12
样例输出
12312
abc
@$
#include<stdlib.h>
#include<stdio.h>
typedef struct LinkNode
{
char data;
struct LinkNode *next;
}LinkNode;
void InitList(LinkNode *&L)
{
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=L;
}
void CreatList(LinkNode *&L,char a[],int n)
{
LinkNode *s,*r=L;
for(int i=0;i<n;i++)
{
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
//尾插法
void Sort(LinkNode *&L,LinkNode *&L1,LinkNode *&L2,LinkNode *&L3)
{
LinkNode *p=L->next,*r1=L1,*r2=L2,*r3=L3,*s1,*s2,*s3;
while(p!=NULL)
{
if(p->data>='0'&&p->data<='9')
{
s1=(LinkNode*)malloc(sizeof(LinkNode));//为什么这里有malloc
s1->data=p->data;//为什么多此一举弄s
s1->next=r1->next;
r1->next=s1;
r1=s1;
}
else if((p->data>='a'&&p->data<='z')||(p->data>='A'&&p->data<='Z'))
{
s2=(LinkNode*)malloc(sizeof(LinkNode));
s2->data=p->data;
s2->next=r2->next;
r2->next=s2;
r2=s2;
}
else
{
s3=(LinkNode*)malloc(sizeof(LinkNode));
p->next=r3->next;
r3->next=p;
r3=p;
}
p=p->next;
}
}
void DisList(LinkNode *&L)
{
LinkNode *p=L->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
}
int main()
{
int i;
LinkNode *L,*L1,*L2,*L3;
InitList(L);
InitList(L1);
InitList(L2);
InitList(L3);
char a[i];
int n;
for(int i=0;;i++)
{
scanf("%d",&a[i]);
if(a[i]=='\n') break;
}
CreatList(L,a,n);
Sort(L,L1,L2,L3);
DisList(L1);
printf("\n");
DisList(L2);
printf("\n");
DisList(L3);
return 0;
}