1039: 单链表中信息的分类

题目描述
已知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);//打表
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值