数据结构字符串
#include "stdafx.h"
#include "conio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;
#define BOOL int
#define TRUE 0
#define FALSE -1
#define MAXSIZE 256
int OutMenu();
BOOL Fun_Assignment(char *s1,char *s2);
BOOL Fun_Connect(char *s1,char *s2);
int Fun_Length(char *s);
BOOL Fun_Compare(char *s1,char *s2);
BOOL Fun_Insert(char *s1,int at_i,char *s2);
BOOL Fun_Delete(char *s,int begin,int DelLen);
char* Fun_SubString(char *s,int begin,int len);
int Fun_BF(char *s1,char *s2);
int Fun_KMP(char *s1,char *s2);
void GetNext(char *s,int next[]);
BOOL Fun_Replace(char *s1,char *s2,char *s3);
int _tmain(int argc, _TCHAR* argv[])
{
char s1[MAXSIZE],s2[MAXSIZE],s3[MAXSIZE];
int at_i,begin,len,ret;
int menu=1;
while(menu)
{
menu=OutMenu();
switch(menu)
{
case 0:
system("cls");
break;
case 1:
printf("请输入字符串1:");
scanf_s("%s",s1,256);
printf("请输入字符串2:");
scanf_s("%s",s2,256);
Fun_Assignment(s1,s2);
printf("s1结果:%s",s1);
printf("\n按任意键返回...");
_getch();
break;
case 2:
printf("请输入字符串1:");
scanf_s("%s",s1,256);
printf("请输入字符串2:");
scanf_s("%s",s2,256);
Fun_Connect(s1,s2);
printf("s1结果:%s",s1);
printf("\n按任意键返回...");
_getch();
break;
case 3:
printf("请输入求长字符串:");
scanf_s("%s",s1,256);
printf("长度为:%d",Fun_Length(s1));
printf("\n按任意键返回...");
_getch();
break;
case 4:
printf("请输入字符串1:");
scanf_s("%s",s1,256);
printf("请输入字符串2:");
scanf_s("%s",s2,256);
printf("比较结果:%d",Fun_Compare(s1,s2));
printf("\n按任意键返回...");
_getch();
break;
case 5:
printf("请输入字符串1:");
scanf_s("%s",s1,256);
printf("请输入字符串2:");
scanf_s("%s",s2,256);
printf("请输入插入位置:");
scanf_s("%d",&at_i);
Fun_Insert(s1,at_i,s2);
printf("s1结果:%s",s1);
printf("\n按任意键返回...");
_getch();
break;
case 6:
printf("请输入原字符串:");
scanf_s("%s",s1,256);
printf("请输入开始删除位置:");
scanf_s("%d",&begin);
printf("请输入删除长度:");
scanf_s("%d",&len);
Fun_Delete(s1,begin,len);
printf("s结果:%s",s1);
printf("\n按任意键返回...");
_getch();
break;
case 7:
printf("请输入原字符串:");
scanf_s("%s",s1,256);
printf("请输入开始位置:");
scanf_s("%d",&begin);
printf("请输入长度:");
scanf_s("%d",&len);
printf("子串结果:%s",Fun_SubString(s1,begin,len));
printf("\n按任意键返回...");
_getch();
break;
case 8:
printf("请输入原字符串:");
scanf_s("%s",s1,256);
printf("请输入查找字符串:");
scanf_s("%s",s2,256);
Fun_BF(s1,s2);
ret=Fun_BF(s1,s2);
if(ret>-1)
printf("子串位于:%d",ret);
else
printf("子串没有找到");
printf("\n按任意键返回...");
_getch();
break;
case 9:
printf("请输入原字符串:");
scanf_s("%s",s1,256);
printf("请输入查找字符串:");
scanf_s("%s",s2,256);
Fun_BF(s1,s2);
ret=Fun_KMP(s1,s2);
if(ret>-1)
printf("子串位于:%d",ret);
else
printf("子串没有找到");
printf("\n按任意键返回...");
_getch();
break;
case 10:
printf("请输入原字符串:");
scanf_s("%s",s1,256);
printf("请输入被替换字符串:");
scanf_s("%s",s2,256);
printf("请输入替换成字符串:");
scanf_s("%s",s3,256);
if(Fun_Replace(s1,s2,s3))
printf("s结果:%s",s1);
else
printf("被替换串没有找到");
printf("\n按任意键返回...");
_getch();
break;
default:
printf("您输入有误,请重新选择。");
_getch();
break;
}
}
return 0;
}
int OutMenu(void)
{
int i;
system("cls");
printf("\n\n 字符串演示程序\n\n");
printf("\t**************************************************************\n");
printf("\t* 1.赋值 2.联接 3.求长 *\n");
printf("\t* 4.比大小 5.插入 6.删除 *\n");
printf("\t* 7.求子串 8.BF 9.KMP *\n");
printf("\t* 10.替换 11.---- 0.退出 *\n");
printf("\t**************************************************************\n");
cout<<"\nPlease Select 0~5: ";
cin>>i;
cout<<"\n\n";
return i;
}
BOOL Fun_Assignment(char *s1,char *s2)
{
int len=strlen(s2);
for(int i=0;i<=len;i++)
s1[i]=s2[i];
return TRUE;
}
BOOL Fun_Connect(char *s1,char *s2)
{
int len1=strlen(s1);
int len2=strlen(s2);
if((len1+len2)>=MAXSIZE)
{
printf("空间不足");
return FALSE;
}
for(int i=len1,j=0;j<=len2;i++,j++)
s1[i]=s2[j];
return TRUE;
}
int Fun_Length(char *s)
{
int len=0;
while(s[len]!=0)
len++;
return len;
}
BOOL Fun_Compare(char *s1,char *s2)
{
int i=0,j=0;
while(s1[i]==s2[j] && s1[i]!=0)
i++,j++;
return s2[j]-s1[i];
}
BOOL Fun_Insert(char *s1,int at_i,char *s2)
{
int len1=strlen(s1);
int len2=strlen(s2);
if((len1+len2)>=MAXSIZE)
{
printf("空间不足");
return FALSE;
}
int i,j;
for(i=at_i,j=len2;i<=len1;i++,j++)
s2[j]=s1[i];
len2=strlen(s2);
for(j=0,i=at_i;j<=len2;i++,j++)
s1[i]=s2[j];
return TRUE;
}
BOOL Fun_Delete(char *s,int begin,int delLen)
{
int sLen=strlen(s);
if((begin+delLen)>sLen)
{
printf("起始位置或长度错误");
return FALSE;
}
for(int i=begin+delLen;i<=sLen;i++)
s[i-delLen]=s[i];
return TRUE;
}
char* Fun_SubString(char *s,int begin,int len)
{
int sLen=strlen(s);
if((begin+len)>sLen)
{
printf("起始位置或长度错误");
return NULL;
}
char s_temp[256];
int i=begin,j=0;
for(;i<begin+len;i++,j++)
s_temp[j]=s[i];
s_temp[j]='\0';
return s_temp;
}
int Fun_BF(char *s1,char *s2)
{
int len1,len2;
len1=strlen(s1);
len2=strlen(s2);
int i=0,j=0;
while (i<len1 && j<len2)
{
if (s1[i]==s2[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
if(i+len2>len1)
break;
}
}
if(j==len2)
return i-len2;
else
return -1;
}
int Fun_KMP(char *s1,char *s2)
{
int next[MAXSIZE];
GetNext(s2,next);
int i,j,len1,len2;
len1=strlen(s1);
len2=strlen(s2);
i=0;
j=0;
while(i<len1 && j<len2)
{
if (j==-1||s1[i]==s2[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j==len2)
return i-len2;
else
return -1;
}
void GetNext(char *s,int next[])
{
int len=strlen(s);
int i=0;
int j=-1;
next[0]=-1;
while(i<len-1)
{
if (j==-1 || s[i]==s[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
BOOL Fun_Replace(char *s1,char *s2,char *s3)
{
int len1,len2,len3;
len1=strlen(s1);
len2=strlen(s2);
len3=strlen(s3);
if((len1-len2+len3)>=MAXSIZE)
{
printf("空间不足");
return FALSE;
}
int ret=Fun_BF(s1,s2);
if(ret==-1)
return FALSE;
Fun_Delete(s1,ret,len2);
Fun_Insert(s1,ret,s3);
return TRUE;
}