n123z 2022-03-30 15:48 采纳率: 76.5%
浏览 43
已结题

链表拆分,提交到oj总是错误,但是给的数据是能通过的,有没有特殊的数据没有想到

已知有一个乱序的字符序列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”结束,输入“-1”前可能没有其它元素,每个字符序列占一行。
输出
链表A中的元素,占一行;然后是链表B中的元素,占一行。最后是链表C中的元素,占一行。每行的每个元素后有一个空格,注意最后一个元素后只有换行符,如果某个链表为空则,则输出“There is no item in X list.”
数据最多的测试用例节点数在100这个数量级。
请注意输入输出格式。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct list{
    char data[3];
    struct list * nextptr;
};
typedef struct list LIST;
typedef LIST * LISTPTR;
LIST * createlist(LISTPTR headptr);
void createlisthead(LISTPTR * headptrptr);
void searchlist(LISTPTR headptr0,LISTPTR headptr1,LISTPTR headptr2,LISTPTR headptr3);
int getsize(LISTPTR headptr);
void sortlist(LIST * headptr);
void printlist(LISTPTR currentptr,char m);
void freelist(LISTPTR headptr);
int main()
{
    LISTPTR headptr0=NULL,headptr1=NULL,headptr2=NULL,headptr3=NULL;
    headptr0=createlist(headptr0);
    createlisthead(&headptr1);
    createlisthead(&headptr2);
    createlisthead(&headptr3);
    searchlist(headptr0,headptr1,headptr2,headptr3);
    if(headptr1->nextptr!=NULL){
        sortlist(headptr1);
    }
    if(headptr1->nextptr!=NULL){
        sortlist(headptr2);
    }
    if(headptr1->nextptr!=NULL){
        sortlist(headptr3);
    }
    printlist(headptr1,'A');
    printlist(headptr2,'B');
    printlist(headptr3,'C');
    freelist(headptr0);
    freelist(headptr1);
    freelist(headptr2);
    freelist(headptr3);
}
LIST * createlist(LISTPTR headptr)
{
    LISTPTR currentptr,newptr;
    newptr=malloc(sizeof(LIST));
    char s[3];
    newptr=malloc(sizeof(LIST));
    newptr->nextptr=NULL;
    headptr=newptr;
    scanf("%s",s);
    while(s[0]!='-'||s[1]!='1'){
        newptr=malloc(sizeof(LIST));
        strcpy(newptr->data,s);
        newptr->nextptr=NULL;
        if(headptr->nextptr==NULL){
            currentptr=newptr;
            headptr->nextptr=currentptr;
        }
        else{
            currentptr->nextptr=newptr;
            currentptr=newptr;
        }
        scanf("%s",s);
    }
    return headptr;
}
void createlisthead(LISTPTR * headptrptr)
{
    *headptrptr=malloc(sizeof(LIST));
    if((*headptrptr)!=NULL){
        (*headptrptr)->nextptr=NULL;
    }
}
void searchlist(LISTPTR headptr0,LISTPTR headptr1,LISTPTR headptr2,LISTPTR headptr3)
{
    char l;
    LISTPTR currentptr0,currentptr1,currentptr2,currentptr3;
    currentptr0=headptr0->nextptr;
    currentptr1=headptr1;
    currentptr2=headptr2;
    currentptr3=headptr3;
    while(currentptr0!=NULL){
        l=currentptr0->data[0];
        if((l>='a'&&l<='z')||(l>='A'&&l<='Z')){
            headptr0->nextptr=currentptr0->nextptr;
            currentptr1->nextptr=currentptr0;
            currentptr1=currentptr1->nextptr;
            currentptr1->nextptr=NULL;
            currentptr0=headptr0->nextptr;
            continue;
        }
        else if(l>='0'&&l<='9'){
            headptr0->nextptr=currentptr0->nextptr;
            currentptr2->nextptr=currentptr0;
            currentptr2=currentptr2->nextptr;
            currentptr2->nextptr=NULL;
            currentptr0=headptr0->nextptr;
            continue;
        }
        else{
            headptr0->nextptr=currentptr0->nextptr;
            currentptr3->nextptr=currentptr0;
            currentptr3=currentptr3->nextptr;
            currentptr3->nextptr=NULL;
            currentptr0=headptr0->nextptr;
            continue;
        }
    }
}
int getsize(LISTPTR headptr)
{
    LISTPTR currentptr;
    currentptr=headptr;
    int n=0;
    while(currentptr!=NULL){
        currentptr=currentptr->nextptr;
        n++;
    }
    return n;
}
void sortlist(LIST * headptr)
{
    LISTPTR previousptr,currentptr,afterptr;
    int n,i,j;
    n=getsize(headptr);
        for(i=1;i<=n-2;i++){
            previousptr=headptr;
            currentptr=previousptr->nextptr;
            afterptr=currentptr->nextptr;
            for(j=1;j<=n-2;j++){
                if(currentptr->data[0] > afterptr->data[0]){
                    currentptr->nextptr=afterptr->nextptr;
                    afterptr->nextptr=currentptr;
                    previousptr->nextptr=afterptr;    
                }
                previousptr=previousptr->nextptr;
                currentptr=previousptr->nextptr;
                afterptr=currentptr->nextptr;
            }
        }
}
void printlist(LISTPTR currentptr,char m)
{
    currentptr=currentptr->nextptr;
    if(currentptr==NULL){
        printf("There is no item in %c list.\n",m);
    }
    else{
        printf("The new list %c: ",m);
        while(currentptr!=NULL){
            if(currentptr->nextptr!=NULL){
                printf("%c ",currentptr->data[0]);
            }
            else if(currentptr->nextptr==NULL){
                printf("%c\n",currentptr->data[0]);
            }
            currentptr=currentptr->nextptr;
        }
    }
}
void freelist(LISTPTR headptr)
{
    LISTPTR currentptr,afterptr;
    currentptr=headptr;
    while(currentptr!=NULL){
        afterptr=currentptr->nextptr;
        free(currentptr);
        currentptr=afterptr;
    }
}

总是RE,只得10分,不知道哪里搞错了,还是哪没想到

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 3月31日
    • 创建了问题 3月30日

    悬赏问题

    • ¥15 java 的protected权限 ,问题在注释里
    • ¥15 这个是哪里有问题啊?
    • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
    • ¥15 texstudio的问题,
    • ¥15 spaceclaim模型变灰色
    • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
    • ¥15 就很莫名其妙,本来正常的Excel,突然变成了这种一格一页
    • ¥15 字符串比较代码的漏洞
    • ¥15 欧拉系统opt目录空间使用100%
    • ¥15 ul做导航栏格式不对怎么改?