已知有一个乱序的字符序列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分,不知道哪里搞错了,还是哪没想到