求一个数据结构的课程设计串基本操作的演示的源代码!!! 50
2个回答
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义顺序串
#define MaxSize 30
typedef struct
{
char data[MaxSize];
int len;
}SqString;
//串的子串个数(顺序串)
int SubNum(SqString s)
{
int n;
n=1+(s.len+1)*s.len/2;
return n;
}
//串的匹配查询(顺序串)
int StrIndex(SqString s,SqString t)//s为主串,t为模式串
{
int i=0,j=0;
while(i<s.len&&j<t.len)//是否到末尾
{
if(s.data[i]==t.data[j])//主串与模式串逐一匹配
{
i++;
j++;
}
else //否则,回溯重新开始下一次匹配
{
i=i-j+1; //主串从下一个位置开始
j=0; //模式串从头开始
}
}
if(j>=t.len) //如果匹配成功
return (i-t.len); //返回主串第一个下标
else
return -1; //匹配失败,返回-1
}
//串的连接
//将串1和串2合并成新串,原串保留
int Concat(SqString str1,SqString str2,SqString &str,int maxlen)
{
int i;
if(str1.len + str2.len > maxlen)//长度之和不能超过maxlen
{
printf("两串合并后的长度超过规定长度.\n");
return 0;
}
else
{
for(i=0;i<str1.len;i++)
str.data[i]=str1.data[i];//将串1复制给新串
for(i=0;i<str2.len;i++)
str.data[str1.len+i]=str2.data[i];//将串2复制给新串
str.data[str1.len+i]='\0';//置结束标志
str.len=str1.len+str2.len;//计算长度和
}
return 1;
}
//串的替换
//串1从第i字符开始的j个字符用串2替换,生成新串
int Replace(SqString str1,int i,int j,SqString str2,SqString &str)
{
int m,n;
if(j!=str2.len)//如果替换长度不等于串2,退出
{
printf("替换长度与串2不等.\n");
return 0;
}
if(i+j-1<=str1.len)//i开始j的长度在串1之内
{
for(m=0;m<i-1;m++)//拷贝串1中0到i-1之间字符
str.data[m]=str1.data[m];
for(n=0;n<str2.len;n++)//拷贝串2的所有字符
str.data[m++]=str2.data[n];
for(n=i+j-1;n<str1.len;n++)//拷贝串1从i+j-1之后的所以字符
str.data[m++]=str1.data[n];
str.data[m]='\0';//置结束标志
str.len=m;//置新串长度
}
else //超过,置长度为0
{
str.data[0]='\0';//置结束标志
str.len=0;
}
return 1;
}
//串中删除字符ch
void Delch(SqString &str,char ch)
{
int i,j;
for(i=0;i<str.len;i++)//遍历元素
{
while(str.data[i]==ch)//如果为ch,将后面元素前移,直到不等于ch为止
{
for(j=i;j<str.len;j++)
str.data[j]=str.data[j+1];//将后面元素前移
str.len=str.len-1;//长度减一
}
}
}
//删除串中从第i个字符开始j个字符
void Delsub(SqString &str,int i,int j)
{
int k;
if(i+j-1>str.len)
{
printf("删除子串长度超过主串长度.\n");
}
else
{
for(k=i+j-1;k<str.len;k++)//遍历元素
{
str.data[k-j]=str.data[k];//后面元素前移
}
str.len=str.len-j; //长度减少
str.data[str.len]='\0'; //置末尾结束
}
}
//串逆序
void ReverseSq(SqString &str)
{
int i,j;
char t;
i=0;
j=str.len-1;//首尾调换
while(i<j)
{
t=str.data[i];
str.data[i]=str.data[j];
str.data[j]=t;
i++;
j--;
}
}
//子串只有一个通配符?,可以代表任意一个字符,返回匹配子串第一次出现位置
int Patten_index(SqString &subs,SqString str)
{
int i,j,k;
for(i=0;i<str.len;i++)
{
for(j=i,k=0;(str.data[j]==subs.data[k])||(subs.data[k]=='?');j++,k++)
if(subs.data[k+1]=='\0')
return(i+1);
}
return -1;
}
//求最长等值子串串头位置和子串
void EqsubString(SqString str)
{
int i,j;
int pos,max,count;
pos=0;
max=1;
for(i=0,j=1;str.data[i]!='\0'&&str.data[j]!='\0';i=j,j++)
{
count=1;
while(str.data[i]==str.data[j])
{
j++;
count++;
}
if(count > max)
{
max=count;
pos=i;
}
}
if(max>1)
{
printf("位置为:%d的最大等值子串:",pos+1);
for(i=pos;i<pos+max;i++)
printf("%c",str.data[i]);
}
else
printf("无最大等值子串.");
printf("\n");
}
int main()
{
SqString str1,str2;
SqString str;
strcpy(str1.data,"abcdefghijkl");
str1.len=strlen(str1.data);
strcpy(str2.data,"aaad");
str2.len=strlen(str2.data);
printf("str1=%d,%s\nstr2=%d,%s\n",str1.len,str1.data,str2.len,str2.data);
//1 串的匹配
printf("串的匹配\n");
if(StrIndex(str1,str2)!=-1)
printf("匹配成功!\n");
else
printf("匹配失败!\n");
printf("\n");
//2 串的连接
printf("串的连接\n");
if(Concat(str1,str2,str,MaxSize))
printf("合并后的新串%d,%s\n",str.len,str.data);
else
printf("合并出错.\n");
printf("\n");
//3 串的替换
printf("串的替换\n");
if(Replace(str1,9,4,str2,str))
printf("替换后的新串长度%d,%s\n",str.len,str.data);
printf("\n");
//4 子串的个数
printf("子串的个数\n");
printf("%s子串个数为:%d\n",str.data,SubNum(str));
printf("\n");
//5 删除一个字符
printf("删除一个字符'b'\n");
printf("原串%s\n",str.data);
Delch(str,'b');
printf("删除后串长度%d,%s\n",str.len,str.data);
printf("\n");
//6 串中从第i个字符开始j个字符
printf("删除从第2个位置删除3个字符\n");
Delsub(str,2,3);
printf("删除子串后串长度%d,%s\n",str.len,str.data);
printf("\n");
//7 串逆序
printf("串逆序\n");
ReverseSq(str);
printf("串逆序长度%d,%s\n",str.len,str.data);
printf("\n");
//8 子串通配符?匹配
printf("子串通配符?匹配:g?\n");
int x;
SqString subs;
strcpy(subs.data,"g?");
subs.len=strlen(subs.data);
if((x=Patten_index(subs,str))>0)
printf("在%d 匹配成功!\n",x);
else
printf("匹配失败!\n");
printf("\n");
//9 求最长等值子串串头位置和子串
printf("求最长等值子串串头位置和子串\n");
EqsubString(str);
printf("\n");
return 0;
}
#include <stdlib.h>
#include <string.h>
//定义顺序串
#define MaxSize 30
typedef struct
{
char data[MaxSize];
int len;
}SqString;
//串的子串个数(顺序串)
int SubNum(SqString s)
{
int n;
n=1+(s.len+1)*s.len/2;
return n;
}
//串的匹配查询(顺序串)
int StrIndex(SqString s,SqString t)//s为主串,t为模式串
{
int i=0,j=0;
while(i<s.len&&j<t.len)//是否到末尾
{
if(s.data[i]==t.data[j])//主串与模式串逐一匹配
{
i++;
j++;
}
else //否则,回溯重新开始下一次匹配
{
i=i-j+1; //主串从下一个位置开始
j=0; //模式串从头开始
}
}
if(j>=t.len) //如果匹配成功
return (i-t.len); //返回主串第一个下标
else
return -1; //匹配失败,返回-1
}
//串的连接
//将串1和串2合并成新串,原串保留
int Concat(SqString str1,SqString str2,SqString &str,int maxlen)
{
int i;
if(str1.len + str2.len > maxlen)//长度之和不能超过maxlen
{
printf("两串合并后的长度超过规定长度.\n");
return 0;
}
else
{
for(i=0;i<str1.len;i++)
str.data[i]=str1.data[i];//将串1复制给新串
for(i=0;i<str2.len;i++)
str.data[str1.len+i]=str2.data[i];//将串2复制给新串
str.data[str1.len+i]='\0';//置结束标志
str.len=str1.len+str2.len;//计算长度和
}
return 1;
}
//串的替换
//串1从第i字符开始的j个字符用串2替换,生成新串
int Replace(SqString str1,int i,int j,SqString str2,SqString &str)
{
int m,n;
if(j!=str2.len)//如果替换长度不等于串2,退出
{
printf("替换长度与串2不等.\n");
return 0;
}
if(i+j-1<=str1.len)//i开始j的长度在串1之内
{
for(m=0;m<i-1;m++)//拷贝串1中0到i-1之间字符
str.data[m]=str1.data[m];
for(n=0;n<str2.len;n++)//拷贝串2的所有字符
str.data[m++]=str2.data[n];
for(n=i+j-1;n<str1.len;n++)//拷贝串1从i+j-1之后的所以字符
str.data[m++]=str1.data[n];
str.data[m]='\0';//置结束标志
str.len=m;//置新串长度
}
else //超过,置长度为0
{
str.data[0]='\0';//置结束标志
str.len=0;
}
return 1;
}
//串中删除字符ch
void Delch(SqString &str,char ch)
{
int i,j;
for(i=0;i<str.len;i++)//遍历元素
{
while(str.data[i]==ch)//如果为ch,将后面元素前移,直到不等于ch为止
{
for(j=i;j<str.len;j++)
str.data[j]=str.data[j+1];//将后面元素前移
str.len=str.len-1;//长度减一
}
}
}
//删除串中从第i个字符开始j个字符
void Delsub(SqString &str,int i,int j)
{
int k;
if(i+j-1>str.len)
{
printf("删除子串长度超过主串长度.\n");
}
else
{
for(k=i+j-1;k<str.len;k++)//遍历元素
{
str.data[k-j]=str.data[k];//后面元素前移
}
str.len=str.len-j; //长度减少
str.data[str.len]='\0'; //置末尾结束
}
}
//串逆序
void ReverseSq(SqString &str)
{
int i,j;
char t;
i=0;
j=str.len-1;//首尾调换
while(i<j)
{
t=str.data[i];
str.data[i]=str.data[j];
str.data[j]=t;
i++;
j--;
}
}
//子串只有一个通配符?,可以代表任意一个字符,返回匹配子串第一次出现位置
int Patten_index(SqString &subs,SqString str)
{
int i,j,k;
for(i=0;i<str.len;i++)
{
for(j=i,k=0;(str.data[j]==subs.data[k])||(subs.data[k]=='?');j++,k++)
if(subs.data[k+1]=='\0')
return(i+1);
}
return -1;
}
//求最长等值子串串头位置和子串
void EqsubString(SqString str)
{
int i,j;
int pos,max,count;
pos=0;
max=1;
for(i=0,j=1;str.data[i]!='\0'&&str.data[j]!='\0';i=j,j++)
{
count=1;
while(str.data[i]==str.data[j])
{
j++;
count++;
}
if(count > max)
{
max=count;
pos=i;
}
}
if(max>1)
{
printf("位置为:%d的最大等值子串:",pos+1);
for(i=pos;i<pos+max;i++)
printf("%c",str.data[i]);
}
else
printf("无最大等值子串.");
printf("\n");
}
int main()
{
SqString str1,str2;
SqString str;
strcpy(str1.data,"abcdefghijkl");
str1.len=strlen(str1.data);
strcpy(str2.data,"aaad");
str2.len=strlen(str2.data);
printf("str1=%d,%s\nstr2=%d,%s\n",str1.len,str1.data,str2.len,str2.data);
//1 串的匹配
printf("串的匹配\n");
if(StrIndex(str1,str2)!=-1)
printf("匹配成功!\n");
else
printf("匹配失败!\n");
printf("\n");
//2 串的连接
printf("串的连接\n");
if(Concat(str1,str2,str,MaxSize))
printf("合并后的新串%d,%s\n",str.len,str.data);
else
printf("合并出错.\n");
printf("\n");
//3 串的替换
printf("串的替换\n");
if(Replace(str1,9,4,str2,str))
printf("替换后的新串长度%d,%s\n",str.len,str.data);
printf("\n");
//4 子串的个数
printf("子串的个数\n");
printf("%s子串个数为:%d\n",str.data,SubNum(str));
printf("\n");
//5 删除一个字符
printf("删除一个字符'b'\n");
printf("原串%s\n",str.data);
Delch(str,'b');
printf("删除后串长度%d,%s\n",str.len,str.data);
printf("\n");
//6 串中从第i个字符开始j个字符
printf("删除从第2个位置删除3个字符\n");
Delsub(str,2,3);
printf("删除子串后串长度%d,%s\n",str.len,str.data);
printf("\n");
//7 串逆序
printf("串逆序\n");
ReverseSq(str);
printf("串逆序长度%d,%s\n",str.len,str.data);
printf("\n");
//8 子串通配符?匹配
printf("子串通配符?匹配:g?\n");
int x;
SqString subs;
strcpy(subs.data,"g?");
subs.len=strlen(subs.data);
if((x=Patten_index(subs,str))>0)
printf("在%d 匹配成功!\n",x);
else
printf("匹配失败!\n");
printf("\n");
//9 求最长等值子串串头位置和子串
printf("求最长等值子串串头位置和子串\n");
EqsubString(str);
printf("\n");
return 0;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询