您的位置:首页 > 其它

分解链表,la表中存放字母,lb中存放数字,lc中存放其它字符

2013-06-01 18:10 417 查看
原题:设 head 是没有带头结点的单链表中指向第一个节点的指针,节点的数据域存储一个字符,该字符可能是英文字符或数字或其他字符。编写算法构造三个以带头结点的单循环链表,使每个链表中只停含同一类字符(要求用最少的时间和最少的空间)。

分析:只要顺序扫描链表 head 中的每个结点,根据节点中所含的字符类型分别插入到不同的单循环链表中即可。

#include<iostream.h>
#include<time.h>
#include<stdlib.h>

typedef struct LNode	//表结点的数据结点
{
char data;
struct LNode *next;
}LNode,*LinkList;

int CreateList(LinkList &head)	//生成单链表,各表结点中存放一个随机生成的字符
{
LinkList p;head=NULL;
srand((unsigned)time(NULL));	//随机种子
for(int k=0;k<100;k++)
{
p=new LNode;	//生成结点
p->data=(char)(32+rand()%94);	//生成随机字符
if(!head)	//如果链表为空,则使 head 头指针指向当前刚生成的结点
{
head=p;head->next=NULL;
}
else	//否则,采用头插法将当前生成的结点插入在紧临表头之后的位置
{
p->next=head->next;head->next=p;
}
}
return 1;
}

int DisplayList(LinkList head)	//逐个显示链表中的所有结点中的数据
{
if(!head)
{
cout<<"当前链表为空!"<<endl;return -1;
}
LinkList p=head;
while(p->next && p->next!=head)
{
cout<<p->data<<" -> ";
p=p->next;
}
cout<<p->data<<endl<<endl;
return 1;
}

int Decompose(LinkList &head,LinkList &la,LinkList &lb,LinkList &lc)
{	//分解链表函数,la表中存放字母,lb中存放数字,lc中存放其它字符
if(!head)
{
cout<<"当前链表为空,无法分解!"<<endl;return -1;
}
la=new LNode;lb=new LNode;lc=new LNode;
la->next=la;lb->next=lb;lc->next=lc;
la->data=lb->data=lc->data='>';	//头结点数据为字符 '>'
LinkList p,pa,pb,pc;p=head;
pa=la;pb=lb;pc=lc;	//pa、pb、pc分别永远指向三个链表的表尾
while(p)
{
if(p->data>'A'&&p->data<'Z' || p->data>'a'&&p->data<'z')
{	//p->data为字母
pa->next=p;pa=pa->next;
}
else if(p->data>'0' && p->data<'9')
{	//p->data为数字
pb->next=p;pb=pb->next;
}
else
{//p->data为其它字符
pc->next=p;pc=pc->next;
}
p=p->next;
}
pa->next=la;	//pa为la的尾结点,其后继为头结点la
pb->next=lb;	//pb为lb的尾结点,其后继为头结点lb
pc->next=lc;	//pc为lc的尾结点,其后继为头结点lc
return 1;
}

int main()
{
LinkList head;
CreateList(head);
DisplayList(head);

LinkList la,lb,lc;
Decompose(head,la,lb,lc);	//调用函数分解链表
cout<<"链表la的数据为:"<<endl;
DisplayList(la);
cout<<"链表lb的数据为:"<<endl;
DisplayList(lb);
cout<<"链表lc的数据为:"<<endl;
DisplayList(lc);
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分解 链表 算法
相关文章推荐