题目描述
已知有一个乱序的字符序列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 <string.h>
#include <stdlib.h>
typedef struct node{
char s[3];
struct node * nextPtr;
}LISTNODE, * LISTNODEPTR;
void createListHead(LISTNODEPTR *,LISTNODEPTR *);
void insertEnd(LISTNODEPTR *,char *);
void splitList(LISTNODEPTR,LISTNODEPTR,LISTNODEPTR,LISTNODEPTR);
void bubbleSort(LISTNODEPTR);
int isEmpty(LISTNODEPTR);
void printList(LISTNODEPTR);
void freeList(LISTNODEPTR);
int main(){
LISTNODEPTR headPtrL,lastPtrL,headPtrA,lastPtrA,headPtrB,lastPtrB,headPtrC,lastPtrC;
createListHead(&headPtrL,&lastPtrL);
createListHead(&headPtrA,&lastPtrA);
createListHead(&headPtrB,&lastPtrB);
createListHead(&headPtrC,&lastPtrC);
char s[3];
memset(s,0,3);
scanf("%s",s);
while((s[0] != '-') || (s[1] != '1')){
insertEnd(&lastPtrL,s);
memset(s,0,3);
scanf("%s",s);
}
splitList(headPtrL,headPtrA,headPtrB,headPtrC);
bubbleSort(headPtrA);
bubbleSort(headPtrB);
bubbleSort(headPtrC);
if(isEmpty(headPtrA)){
printf("There is no item in A list.\n");
}
else {
printf("The list A is: ");
printList(headPtrA);
}
if(isEmpty(headPtrB)){
printf("There is no item in B list.\n");
}
else {
printf("The list B is: ");
printList(headPtrB);
}
if(isEmpty(headPtrC)){
printf("There is no item in C list.\n");
}
else {
printf("The list C is: ");
printList(headPtrC);
}
freeList(headPtrL);
freeList(headPtrA);
freeList(headPtrB);
freeList(headPtrC);
return 0;
}
void createListHead(LISTNODEPTR * headPtrPtr,LISTNODEPTR * lastPtrPtr){
(*headPtrPtr) = malloc(sizeof(LISTNODE));
if((*headPtrPtr) != NULL){
(*headPtrPtr)->nextPtr = NULL;
(*lastPtrPtr) = (*headPtrPtr);
}
else{
printf("Error!-101");
}
}
void insertEnd(LISTNODEPTR * lastPtrPtr,char * s){
LISTNODEPTR newPtr = malloc(sizeof(LISTNODE));
if(newPtr != NULL){
int i;
for(i = 0;i < 3;i++){
newPtr->s[i] = s[i];
}
newPtr->nextPtr = NULL;
(*lastPtrPtr)->nextPtr = newPtr;
(*lastPtrPtr) = newPtr;
}
}
void splitList(LISTNODEPTR headPtrL,LISTNODEPTR headPtrA,LISTNODEPTR headPtrB,LISTNODEPTR headPtrC){
LISTNODEPTR previousPtr = headPtrL,currentPtr = headPtrL->nextPtr;
while(currentPtr != NULL){
if((currentPtr->s[0]>='A'&¤tPtr->s[0]<='Z')||(currentPtr->s[0]>='a'&¤tPtr->s[0]<='z')){
headPtrA->nextPtr = currentPtr;
headPtrA = currentPtr;
previousPtr->nextPtr = currentPtr->nextPtr;
currentPtr->nextPtr = NULL;
currentPtr = previousPtr->nextPtr;
}
else if(currentPtr->s[0]>='0'&¤tPtr->s[0]<='9'){
headPtrB->nextPtr = currentPtr;
headPtrB = currentPtr;
previousPtr->nextPtr = currentPtr->nextPtr;
currentPtr->nextPtr = NULL;
currentPtr = previousPtr->nextPtr;
}
else{
headPtrC->nextPtr = currentPtr;
headPtrC = currentPtr;
previousPtr->nextPtr = currentPtr->nextPtr;
currentPtr->nextPtr = NULL;
currentPtr = previousPtr->nextPtr;
}
}
}//将链表拆至A、B、C中
void bubbleSort(LISTNODEPTR headPtr){
LISTNODEPTR previousPtr,currentPtr;
LISTNODEPTR lastPtr = NULL;
while(lastPtr != headPtr->nextPtr){
previousPtr = headPtr;
currentPtr = headPtr->nextPtr;
while(currentPtr->nextPtr != lastPtr){
if(currentPtr->s[0] > currentPtr->nextPtr->s[0]){
previousPtr->nextPtr = previousPtr->nextPtr->nextPtr;
currentPtr->nextPtr = currentPtr->nextPtr->nextPtr;
previousPtr->nextPtr->nextPtr = currentPtr;
}
else currentPtr = currentPtr->nextPtr;
previousPtr = previousPtr->nextPtr;
}
lastPtr = currentPtr;
}
}//冒泡排序
int isEmpty(LISTNODEPTR headPtr){
if(headPtr->nextPtr == NULL){
return 1;
}
return 0;
}
void printList(LISTNODEPTR headPtr){
while(headPtr->nextPtr->nextPtr != NULL){
headPtr = headPtr->nextPtr;
printf("%c ",headPtr->s[0]);
}
headPtr = headPtr->nextPtr;
printf("%c\n",headPtr->s[0]);
}
void freeList(LISTNODEPTR headPtr){
LISTNODEPTR tempPtr = headPtr;
while(headPtr != NULL){
headPtr = headPtr->nextPtr;
free(tempPtr);
tempPtr = headPtr;
}
}