编写一个程序linklist,实现单链表的各种基本运算和整体建表算法(假设单链表的元素类型DataType为char),并在此基础上设计一个程序,完成以下功能:
有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3包含L中的所有大写字母结点,要求完成:
- 初始化单链表L,L1,L2,L3;
- 整体建立单链表L(内容自定);
- 输出单链表L;
- 输出单链表L的长度;
- 拆分单链表L;
- 输出单链表L1,L2,L3;
- 输出单链表L1,L2,L3的长度;
- 统计单链表L中整数(连续的数字为一个整数,比如:a12v367mn4为3个整数)的个数并输出;
9.释放单链表L,L1,L2,L3。
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef char DataType;
typedef struct Node
{
DataType data;
Node *next;
}List;
//初始化链表
void InitList(List *&L)
{
L = (List *)malloc(sizeof(List));
L->next = NULL;
}
//创建链表
void CreateList(List *&L,DataType a[])
{
List *p,*r;
r = L;
int length = strlen(a);
for(int i=0;i<length;i++)
{
p=(List *)malloc(sizeof(List));
p->data = a[i];
r->next = p;
r=p;
}
r->next = NULL;
}
//输出链表
void OutList(List *L)
{
List *p = L->next;
while(p != NULL)
{
cout<<" "<<p->data;
p = p->next;
}
}
//输出链表的长度
int ListLength(List *L)
{
List *p = L->next;
int i=0;
while(p != NULL)
{
i++;
p = p->next;
}
return i;
}
//拆分链表
void SplitList(List *&L,List *&L1, List *&L2,List *&L3)
{
List *p = L->next,*q,*r1 = L1,*r2 = L2,*r3 = L3;
while(p != NULL)
{
q = (List *)malloc(sizeof(List));
q->data = p->data;
if(p->data >= '0' && p->data <= '9')
{
r1->next = q;
r1 = q;
}
else if(p->data>= 'a' && p->data <= 'z')
{
r2->next = q;
r2 = q;
}
else
{
r3->next = q;
r3 = q;
}
p = p->next;
}
r1->next=NULL;
r2->next=NULL;
r3->next=NULL;
}
//统计单链表L中的整数个数
int Count(List *L)
{
int count = 0;
List *p;
p = L->next;
while(p != NULL)
{
if((p->data >= '0' && p->data <= '9')&&!(p->next->data >= '0' && p->next->data <= '9'))
count++;
p=p->next;
}
return count;
}
//
int Count1(List *L,int b[])
{
int count = 0;
List *p;
p = L->next;
while(p != NULL)
{
if(p->data >= '0' && p->data <= '9')
{
b[count]=b[count]*10+p->data-48;
if(!(p->next->data >= '0' && p->next->data <= '9'))
{
count++;
}
}
p=p->next;
}
return count;
}
//释放链表
void FreeList(List * L)
{
List * p = L->next,*q;
while(p != NULL)
{
q = p;
p = p->next;
free(q);
}
L->next = NULL;
}
int main()
{
List *L,*L1,*L2,*L3;
//1、初始化链表
cout<<"初始化链表L,L1,L2,L3\n\n";
InitList(L);
InitList(L1);
InitList(L2);
InitList(L3);
//2、建立单链表
cout<<"建立单链表L\n\n";
DataType a[]="1Wxy520Lgr";
CreateList(L,a);
//3、输出单链表L
cout<<"输出单链表L:";
OutList(L);
//4、输出链表L的长度
cout<<"\n\n链表的长度为:";
cout<<ListLength(L);
//5、拆分单链表L
cout<<"\n\n拆分单链表L";
SplitList(L,L1,L2,L3);
//6、输出单链表L1,L2,L3
cout<<"\n\n输出单链表L1,L2,L3" ;
cout<<"\n输出单链表L1:";
OutList(L1);
cout<<"\n输出单链表L2:";
OutList(L2);
cout<<"\n输出单链表L3:";
OutList(L3);
//7、输出单链表L1,L2,L3的长度
cout<<"\n\n输出单链表L1,L2,L3的长度";
cout<<"\n单链表L1长度:";
cout<<ListLength(L1);
cout<<"\n单链表L1长度:";
cout<<ListLength(L2);
cout<<"\n单链表L1长度:";
cout<<ListLength(L3);
//8、统计单链表L中的整数的个数
cout<<"\n\n统计单链表L中的整数的个数:";
cout<<Count(L);
int i;
int b[100]={0};
Count1(L,b);
cout<<"\n单链表L中的整数:";
for(i=0;i<Count(L);i++)
{
cout<<b[i]<<" ";
}
//9、释放单链表L,L1,L2,L3
cout<<"\n\n释放单链表L,L1,L2,L3";
FreeList(L);
FreeList(L1);
FreeList(L2);
FreeList(L3);
return 0;
}