已知由单链表表示的线性表中含有三类字符(数字,字母和其他字符)试编写算法来构造三个循环链表,使每个表中只含某一类字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。

 核心算法:

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);
}

结果示例

《已知由单链表表示的线性表中含有三类字符(数字,字母和其他字符)试编写算法来构造三个循环链表,使每个表中只含某一类字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。》

    原文作者:huiove
    原文地址: https://blog.csdn.net/m0_53714639/article/details/120631346
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞