原题:设 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<<"当前链表为空