qq_74011020 2023-04-23 02:49 采纳率: 100%
浏览 50
已结题

一个关于C语言链表的问题

已知有一个乱序的字符序列L,序列中的字符可能是英文字母、数字字符或其它字符,字符的个数未知,每个字符之间用空格分开。字符序列用“-1”作为输入结束标志,这里你要把-1当做一个字符串对待,并且不算作字符序列中的元素。如下即为一个合法的字符序列:“a c 3 b a d 6 , & j m 8 7 2 V -1”。你的任务是将这个字符序列拆分为三个独立的序列A、B和C,其中序列A存放序列L中的字母,序列B存放序列L中的数字,序列C存放序列L中的其他字符,然后,将序列A、B和C分别按照ASCII码的大小关系进行升序排序。最终序列L将变为空序列。
要求:
建立四个单链表,分别存储序列L、A、B、C中的元素。字符序列的输入用“-1”作为结束标志。建立链表L时,建议使用scanf(“%s”,s);来读取字符序列中的字符,即把单独的字符看做一个字符串读取。当L建立后,你要按照问题描述中所述,将L拆分为A、B、C三个链表,然后对每个链表都进行排序,这部分的操作都应该是对指针进行修改,而不是删除节点与建立新节点。在程序结束前要释放链表A、B、C中的所有节点。

下面是样例:
1.
输入:
a c 3 b a d 6 , & j m 8 7 2 V -1
输出:
The list A is: V a a b c d j m
The list B is: 2 3 6 7 8
The list C is: & ,
2.
输入:
z m v 1 a K 2 m p 9 a 0 a d -1
输出:
The list A is: K a a a d m m p v z
The list B is: 0 1 2 9
There is no item in C list.

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2023-04-23 10:58
    关注

    供参考:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    typedef struct node {
        char    data;
        struct node* next;
    }Node,*list;
    void createlist(list* L)
    {
        char str[3];
        Node* p = NULL, * pL = NULL;
        while (1)
        {
            scanf("%s", str);
            if (!strcmp(str, "-1"))  break;
            p = (list)malloc(sizeof(Node));
            p->next = NULL;
            p->data = str[0];
            if (!(*L))
                (*L) = p;
            else
                pL->next = p;
            pL = p;
        }
    }
    
    void printlist(list L)
    {
        Node* p = NULL;
        if (!L)
            printf("NULL");
        else {
            p = L;
            while (p) {
                printf(p == L ? "%c" : " %c", p->data);
                p = p->next;
            }
        }
        printf("\n");
    }
    
    list insert(list L, Node* pt)
    {
        list p = L;
        while (p->next && p->next->data < pt->data)
        {
            p = p->next;
        }
        if (p == L && p->data > pt->data) {
            pt->next = L;
            L = pt;
        }
        else {
            pt->next = p->next;
            p->next = pt;
        }
        return L;
    }
    
    void split_sort(list* L, list* A, list* B, list* C) //拆分 + 排序
    {
        Node* pL = (*L), * pt = NULL, * pA = NULL, * pB = NULL, * pC = NULL;
        (*L) = NULL;
        while (pL)
        {
            pt = pL;
            pL = pL->next;
            pt->next = NULL;
            if (isalpha(pt->data)) {    //字母链入A
                if (!(*A))
                    (*A) = pt;
                else 
                    (*A) = insert((*A), pt);
            }
            else if (isalnum(pt->data)) { //数字链入B
                if (!(*B))
                    (*B) = pt;
                else
                    (*B) = insert((*B), pt);
            }
            else {                     //其他字符链入C
                if (!(*C))
                    (*C) = pt;
                else
                    (*C) = insert((*C), pt);
            }
        }
    }
    
    void destroy(list L)
    {
        Node* pt = NULL;
        while (L)
        {
            pt == L;
            L = L->next;
            free(pt);
        }
        L = NULL;
    }
    
    int main()
    {
        list L = NULL, A = NULL, B = NULL, C = NULL;
    
        createlist(&L);
    
        split_sort(&L, &A, &B, &C);
    
        if (A) {
            printf("The list A is:");
            printlist(A);
        }
        else
            printf("There is no item in A list.\n");
    
        if (B) {
            printf("The list B is:");
            printlist(B);
        }
        else
            printf("There is no item in B list.\n");
    
        if (C) {
            printf("The list C is:");
            printlist(C);
        }
        else
            printf("There is no item in C list.");
    
        destroy(A);
        destroy(B);
        destroy(C);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 对于知识的学以致用的解释
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败