1.题目:
Problem Description
已知一个字符串含有三类字符:字母、数字和其他字符。试编写算法,构成三个链表,使每个单链表中只含有同一类字符。
Input
输入包含多组测试数据,每组测试数据第一行是一个T,表示有T组数据,接下来有T行,每行有有一个字符串,每个字符串长度n(0<n<=100)(字符串中可能含有空格)如果T等于零则输入结束。
Output
三行为一组: 第一行输出字母链表,第二行输出数字链表,第三行输出其他字符链表,且其每个链表中字符的相对顺序保持不变;每一组数据后有一个换行。
Sample Input
2
wo[ai]zsacm201314!
zhu~ni~tian88888tian~kaixing^_^!
0
Sample Output
woaizsacm
201314
[]!
zhunitiantiankaixing
88888
~~~^_^!
2.参考代码:
#include <iostream>
using namespace std;
struct Node{
char data;
Node* next;
};
class LinkList{
private:
Node* Abchead;
Node* Numhead;
Node* Elsehead;
public:
LinkList(char* s);
~LinkList();
void show();
};
LinkList::LinkList(char* a){
Abchead=new Node;
Numhead=new Node;
Elsehead=new Node;
Node* Abcrear=Abchead;
Node* Numrear=Numhead;
Node* Elserear=Elsehead;
for(int i=0;i<strlen(a);i++){
Node* s=new Node;
s->data=a[i];
if(a[i]>='A' && a[i]<='Z' || a[i]>='a' && a[i]<='z'){
Abcrear->next=s;
Abcrear=s;
}
else if(a[i]>='0' && a[i]<='9'){
Numrear->next=s;
Numrear=s;
}
else{
Elserear->next=s;
Elserear=s;
}
}
Abcrear->next=NULL;
Numrear->next=NULL;
Elserear->next=NULL;
}
LinkList::~LinkList(){
Node* Pabc=Abchead,* Qabc;
while(Pabc){
Qabc=Pabc;
Pabc=Pabc->next;
delete Qabc;
}
Node* Pnum=Numhead,* Qnum;
while(Pnum){
Qnum=Pnum;
Pnum=Pnum->next;
delete Qnum;
}
Node* Pelse=Elsehead,* Qelse;
while(Pelse){
Qelse=Pelse;
Pelse=Pelse->next;
delete Qelse;
}
}
void LinkList::show(){
Node* Pabc=Abchead->next;
Node* Pnum=Numhead->next;
Node* Pelse=Elsehead->next;
int f1=0,f2=0,f3=0;
while(Pabc){
cout<<Pabc->data;
Pabc=Pabc->next;
f1++;
}
if(f1)
cout<<endl;
while(Pnum){
cout<<Pnum->data;
Pnum=Pnum->next;
f2++;
}
if(f2)
cout<<endl;
while(Pelse){
cout<<Pelse->data;
Pelse=Pelse->next;
f3++;
}
if(f3)
cout<<endl;
}
int main()
{
int t;
char s[1111];
while(cin>>t){
getchar();
while(t--){
gets(s);
LinkList w(s);
w.show();
cout<<endl;
}
}
return 0;
}