⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 function.h

📁 数据结构课程设计, 文本编辑, 自己写算法实现查找串儿匹配.c语言编码.
💻 H
字号:
////////////////-----------该头文件用来包含主要功能子函数----------/////////////////

int depth=0;//用户实际输入的文本的行数
int * next=NULL;//KMP算法当中的求得NEXT值
int strl;//用户输入传的长度

typedef struct row
{
    char *data;
    struct row *nextrow;
}row, *rowType;//存储结构的定义
typedef struct
{
		int scount;
		int position[10];
}Reco, *record;
///////////////////------函数声明部分--------//////////////////////////////////
void InputInfo(row *&);//提示用户输入文本
int SpaceC(row *&);//统计文本中的空格数目
int NumC(row *&);//统计文本中的数字数目
int CharC(row *&);//统计文本中的字母数目
int SumC(row *&);//统计文本中的字母数目
int SCharC(row *&);//统计文本中的特殊字符数目
void handle(row *&);//字符串综合处理入口函数
void seaStr(row *&,char *,record);//计算存储模式串信息
int findString(char *,char *,int);//KMP模式匹配
void getNext(char *);//求KMP算法的NEXT函数值
int outTCout(record);//输出模式串出现的次数
void delStr(row *&,record Rec);//删除操作入口函数
void Delete(char *,record,int);//删除特定行中的模式串
void IniMenu(row *head);//串处理之后的菜单控制程序
void ShowBackInfo(row *&);//回显用户输入的文本于屏幕
void ShowGlobal(row *&);//显示统计信息
void aboutAuthor();//显示制作人信息
int Break();//返回确认函数
int Exit();//退出确认函数
/////////////////////////////--用户数据输入--//////////////////////////////////
void InputInfo(row *& head)
{
	welcome(0);
	cout<<"		  请输入文章,每行最长80个字符.\n"<<endl;
	cout<<"	  回车结束一行的输入并以连续两个回车结束文章的输入。"<<endl;
	welcome(1);
    rowType p=new row;
	p->nextrow=NULL;
    head=p;
    char rowTemp[80];
    while(TRUE)
    {
       gets(rowTemp);
	   if(rowTemp[0]==NULL)//如果用户什么都没输入则退出输入文本模式
		   break;
	   depth++;//用于监视用户实际输入的文本的行数,不允许有空行存在
       p=p->nextrow=new row;
       p->data=new char[strlen(rowTemp)];
       strcpy(p->data,rowTemp);
	}
	p->nextrow=NULL;
}
/////////////////////////////---统计空格个数---/////////////////////////////
int SpaceC(row *& head)
{ 
    if(rowType p=head)
	{
		int count=0;
		while((p=p->nextrow)!=NULL)
		{
			int Len=strlen(p->data);
			for(int i=0;i<Len;i++)
				if(p->data[i]==32)
					count++;
		}
		return count;
	}
	else return 0;
}
/////////////////////////////---统计数字数---/////////////////////////////
int NumC(row *& head)
{ 
    if(rowType p=head)
	{
		int count=0;
		for(;(p=p->nextrow)!=NULL;)
		{        
		 int Len=strlen(p->data);
		 for(int i=0;i<Len;i++)
			if(p->data[i]>=48 && p->data[i]<=57)
				count++; 
		}    
    return count;
	}
	else	return 0;
}
/////////////////////////////---统计字母数---/////////////////////////////
int CharC(row *& head)
{
	if(rowType p=head)
	{
		int count=0;
		for(;(p=p->nextrow)!=NULL;)
		{        
		 int Len=strlen(p->data);
		 for(int i=0;i<Len;i++)
			if((p->data[i]>=65 && p->data[i]<=90)||(p->data[i]>=97 && p->data[i]<=122))
				count++; 
		}    
    return count;
	}
	else return 0;
}
/////////////////////////////---所有字符统计---/////////////////////////////
int SumC(row *&head)
{ 
    if(rowType p=head)
	{
		int count=0;

		for (;(p=p->nextrow)!=NULL;)
		{
			count+=strlen(p->data);
		}
		return count;
	}
	else return 0;
}
/////////////////////////////---特殊字符统计---/////////////////////////////
int SCharC(row *& head)
{
	if(rowType p=head)
	{
		int count=SumC(p);
		int spaceCount=SpaceC(p);
		int numCount=NumC(p);
		int charCount=CharC(p);
		return count-spaceCount-numCount-charCount;
	}
	else return 0;
}
/////////////////////////////---字符串综合处理入口函数---///////////////////////////
void handle(row *& head)
{
	if(rowType p=head)
	{
		system("cls");
		record Recor=new Reco[depth];
		////////////////////////////////////////////////////
		for(int k=0;k<depth;k++)
		{
			Recor[k].scount=0;
			for(int m=0;m<10;m++)
				Recor[k].position[m]=0;
		}
		///////////////////////////////该模块对Recor进行初始化,没有该过程将出错
		char tempString[20]="";
		char tStr[21]="";
		cout<<endl;
		welcome(0);
		cout<<endl;
		cout<<"		请输入您要操作的字串,20字符以内,回车结束:"<<endl;
		gets(tempString);
		strl=strlen(tempString);
		*tStr=strl;
		strcat(tStr,tempString);
		getNext(tStr);
		while(TRUE)
		{
			system("cls");
			showMenu2();
			char f;//哨兵,作用于页面跳转
			int a;
			cin>>a;
			switch (a)
			{
				case 1:
				{
					system("cls");
					seaStr(p,tStr,Recor);
					welcome(0);
					cout<<"			该字符串在文章出现的数为: "<<outTCout(Recor)<<endl;
					welcome(1);
					cout<<"		请按任意键继续程序('Q'退出):";
					cin>>f;
					if(f=='q'||f=='Q')
						exit(0);
					else break;
				}
				case 2:
				{
					system("cls");
					seaStr(p,tStr,Recor);
					welcome(0);
					delStr(p,Recor);
					system("cls");
					cout<<endl<<endl;
					cout<<"		-------------------删除操作完成!-----------------"<<endl<<endl;
					cout<<"		       请按任意键继续程序('Q'退出):";
					cin>>f;
					if(f=='q'||f=='Q')
						exit(0);
					else break;
					}
				case 3:
				{
					system("cls");
					ShowBackInfo(head);
					cout<<"		请按任意键继续程序('Q'退出):";
					cin>>f;
					if(f=='q'||f=='Q')
						exit(0);
					else break;
				 }
				case 4:
				{
					system("cls");
					IniMenu(p);
				}
				case 5:
					exit(0);
			}	
		}
	}
	else
			cout<<"\n		     Error,不能进行该操作,请先输入一篇文章!\n\n";
}

/////////////////////////////---计算存储模式串信息---/////////////////////////////
void seaStr(row *& head,char *Tstring,record rec)
{
	int i=0;
	rowType p=head;
	record Reco=rec;
	char *Tstr=Tstring;
	int len,po,pos;//len为数据域长度,po为模式串的上一个位置pos为一个位置
	for(;(p=p->nextrow)!=NULL;)
	{
		pos=0;
		len=strlen(p->data)-strl;
		for(int j=0;pos<len;j++)
		{
			po=findString((p->data),Tstr,pos);
			if(po)
			{	
				Reco[i].position[j]=po;
				Reco[i].scount++;
				pos=findString((p->data),Tstr,pos)+strl;
			}
			else break;
		}
		i++;
	}
}

/////////////////////////////---求KMP算法的NEXT函数值---/////////////////////////////
void getNext(char * Tstring)
{
	char * p=Tstring;
	int i=1,j=0;
	next=new int[strl+1];
	next[1]=0;
	while(i<strl)
	{
		if(j==0||p[i]==p[j])
		{
			++i;++j;
			if(p[i]!=p[j])
				next[i]=j;
			else
				next[i]=next[j];
		}
		else j=next[j];
	}
}

/////////////////////////////---KMP算法实现---/////////////////////////////
int findString(char *Sstring,char *Tstring,int pos)
{

	int i=pos;
	int j=1;
	char *Tstr=Tstring;
	char *Sstr=Sstring;
	int len=strlen(Sstr);
	while(i<len&&j<=strl)
	{
		if(j==0||Sstr[i]==Tstr[j])
		{
			++i;
			++j;
		}
		else
			j=next[j];
	}
	if(j>strl)
		return i-strl;
	else return 0;
}

/////////////////////////////---输出模式串出现的次数---/////////////////////////////
int outTCout(record reco)
{
	record rec=reco;
	int count=0;
	for(int i=0;i<depth;i++)
		count=count+rec[i].scount;
	return count;
}

/////////////////////////////---删除用户输入的字符串---/////////////////////////////
void delStr(row *& head,record Rec)//删除操作入口函数
{	
	rowType p=head;
	record rec=Rec;
	int flag;
	showMenu3();//删除操作菜单
	cin>>flag;
	switch (flag)
	{
		case 1:
		{	
			p=p->nextrow;
			for(int i=0;i<depth;i++)//循环删除每一行中的模式串		
			{	
				Delete(p->data,rec,i);
				p=p->nextrow;
			}
			break;
		}
		case 2:
		{
			system("cls");
			welcome(1);
			cout<<"		请输入您要删除模式串的行数:";
			int row;
			cin>>row;
			p=p->nextrow;
			Delete(p->data,rec,row-1);
			break;
		}
	}
}
/////////////////////////////---删除特定行中的模式串---//////////////////////////
void Delete(char * Sstring,record Rec,int Line)
{
	int line=Line;
	record rec=Rec;
	char *sstr=Sstring;
	char tstring[80],*loc;
	
	int catlo,l;
	for(l=0;l<rec[line].scount;l++)
	{
	catlo=rec[line].position[l]-l*strl;//第几个位置就得减去相应倍数的模式串长
	loc=&sstr[catlo]; 
    int Tlen=strlen(sstr);
    int i=Tlen-strlen(loc);
    int j=i+strl;
    int num=0;
    for(int m=0;m<i;m++)
	{
		tstring[num]=sstr[m];
		num++;
	}
	for(m=j;m<Tlen;m++)
	{
		tstring[num]=sstr[m];
		num++;
	}
    tstring[num]=0;//强制tsring结尾
	strcpy(sstr,tstring);
	}
}
/////////////////////////////---用户输入的文本回显---/////////////////////////////
void ShowBackInfo( row *& head)
{
    if(rowType p=head)
	{	welcome(0);
		for(;(p=p->nextrow)!=NULL;)
			cout<<p->data<<endl;
	}
	else
		cout<<"\n		     Error:无法回显数据,您并没有输入什么字串!\n\n";
}
////////////////////////////--菜单控制程序--/////////////////////////////////
void IniMenu(row *head)//串处理之后的主菜单程序
{
	rowType p=head;
	char menu;
	while(TRUE)
	{
		showMenu4();
		char f;//哨兵,起到中断作用
		cin>>menu;
		switch(menu)
		{
			case 'A':
			case 'a':
			{
				system("cls");
				ShowGlobal(head);
					cout<<"		请按任意键继续程序('Q'退出)";
					cin>>f;
					if(f=='q'||f=='Q')
						exit(0);
					else break;
			}
			case 'B':
			case 'b':
			{	
				system("cls");
				cout<<endl;
				aboutAuthor();
					cout<<"		请按任意键继续程序('Q'退出)";
					cin>>f;
					if(f=='q'||f=='Q')
						exit(0);
					else break;
			}
			case 'Q':
			case 'q':
				exit(0);
			default:
			{
				system("cls");
				cout<<endl;
				welcome(0);
				cout<<"		对不起,您的输入有误,请重新输入!\n";
					cout<<"		请按任意键继续程序('Q'退出)";
					cin>>f;
					if(f=='q'||f=='Q')
						exit(0);
					else break;
			}
		}
	}
	system("cls");
}
/////////////////////////////---所有统计信息回显---/////////////////////////////
void ShowGlobal(row *& head)
{
	
	if(rowType p=head)
	{
		welcome(0);
		cout<<"	             ※ 文章统计信息结果如下:※\n";
		cout<<endl;
		welcome(1);
		cout<<"	           	文章总行数为: "<<depth<<endl;
		welcome(1);
		cout<<"	           	英文字母数为: "<<CharC(p)<<endl;
		welcome(1);
		cout<<"	           	文章空格数为: "<<SpaceC(p)<<endl;
		welcome(1);
		cout<<"	           	文章数字数为: "<<NumC(p)<<endl;
		welcome(1);
		cout<<"	           	特殊字符数为: "<<SCharC(p)<<endl;
		welcome(1);
		cout<<"	           	文章的总字数: "<<SumC(p)<<endl;
		welcome(1);
		cout<<endl;
	}
	else
		cout<<"\n	   Error(-_-)!!!:无效数据统计,您并没有输入什么字串!\n\n";
}

/////////////////////////////---制作人信息函数---/////////////////////////////
void aboutAuthor()
{	
		welcome(0);
		cout<<"	           本系统信息如下:\n";
		welcome(1);
		cout<<"	           版本信息:Version 1.0 "<<endl;
		welcome(1);
		cout<<"	           制作单位:山东理工大学计算机学院 "<<endl;
		welcome(1);
		cout<<"	           班级:计科0402班 "<<endl;
		welcome(1);
		cout<<"	           制作人:王栋栋,刘海潮 "<<endl;
		welcome(1);
		cout<<endl;
}

/////////////////////////////---中断确认---/////////////////////////////
int Break()
{
	cout<<"         ------ 键入字母 m 继续程序!键入其余信息退出系统!-----\n";
	cout<<endl;
	char flag;
	cin>>flag;
	if(flag=='m')
	return TRUE;
	else return FALSE;
}

int Break(int fl)//返回确认
{	int i=fl;
	if(i==1)
		cout<<"         ------ 键入字母 m 继续程序!键入其余信息退出系统!-----"<<endl;
	else
		cout<<"           -------确认退出吗?[N]返回,任意键退出!--------"<<endl;
	cout<<endl;
	 switch (char flag=getch())
	 {
		case 'M':
		case 'm':
			return TRUE;
		default: exit(FALSE);
	 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -