单链表拆分(单链表)

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;
}


 

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值