链表的创建、初始化、拆分、统计、输出、释放C++

编写一个程序linklist,实现单链表的各种基本运算和整体建表算法(假设单链表的元素类型DataType为char),并在此基础上设计一个程序,完成以下功能:
有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3包含L中的所有大写字母结点,要求完成:

  1. 初始化单链表L,L1,L2,L3;
  2. 整体建立单链表L(内容自定);
  3. 输出单链表L;
  4. 输出单链表L的长度;
  5. 拆分单链表L;
  6. 输出单链表L1,L2,L3;
  7. 输出单链表L1,L2,L3的长度;
  8. 统计单链表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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值