*Copyright (c)2016,烟台大学计算机学院
*All rights reserved.
*文件名称:传写.cpp
*作者:李欣
*完成日期:2016年12月15日
*版本号:v1.0
*
*/
main.cpp
#include <iostream>
using namespace std;
#include "sqstring.h"
#include <stdio.h>
int main()
{
SqString s,s1,s2,s3,s4;
StrAssign(s,"abcbcadef");
printf("输出串s :\n");
DispStr(s);
StrAssign(s1,"advcdbmn");
printf("输出串s1 :\n");
DispStr(s1);
s2=CommonChar(s, s1);
printf("输出公共子串s2 :\n");
DispStr(s2);
Invert(s);//逆置
printf("输出逆置后的串s :\n");
DispStr(s);
StrAssign(s3,"abcbcadef");
printf("输出串s3 :\n");
DispStr(s3);
StrAssign(s4,"abcbcadef");
printf("输出串s4 :\n");
DispStr(s4);
Trans(s3,'b','p');//把s中所有值为c1的字符全部替换为值为c2的字符
printf("输出替换后的串s3 :\n");
DispStr(s3);
DellChar(s4,'b');//从s中删除所有值为b的字符
printf("输出删除后的串s4 :\n");
DispStr(s4);
return 0;
}
sqString.cpp
#include "sqstring.h"
#include<stdio.h>
#include <malloc.h>
void StrAssign(SqString &s,char cstr[]) //字符串常量cstr赋给串s
{ //s为引用型参数
int i;
for(i=0;cstr[i]!='\0';i++)
s.data[i]=cstr[i];
s.length=i;
}
void StrCopy(SqString &s,SqString t) //串t复制给串s
{ //s为引用型参数
int i;
for(i=0;i<t.length;i++)
s.data[i]=t.data[i];
s.length=t.length;
}
bool StrEqual(SqString s,SqString t) //判串相等
{
bool same=true;
int i;
if(s.length!=t.length)//长度不相等时返回0
same=false;
else
for(i=0;i<s.length;i++)
if(s.data[i]!=t.data[i])//有一个人字符不相等时返回0
{
same=false;
break;
}
return same;
}
int StrLength(SqString s) //求串长
{
return s.length;
}
SqString Concat(SqString s,SqString t) //串连接
{
SqString str;
int i;
str.length=s.length+t.length;
for(i=0;i<s.length;i++)
str.data[i]=s.data[i];
for(i=0;i<t.length;i++)
str.data[s.length+i]=t.data[i];
return str;
}
SqString SubStr(SqString s,int i,int j) //求子串
{
SqString str;
int k;
str.length=0;
if(i<0 || i>s.length || j<0 || i+j-1>s.length)
return str ;//参数不正确时返货空串
for(k=i-1;k<i+j-1;k++)//将s.data[i..i+j]复制到str
str.data[k-i+1]=s.data[k];
str.length=j;
return str;
}
SqString InsStr(SqString s1,int i,SqString s2) //串插入
{
int j;
SqString str;
str.length=0;
if(i<0 || i>s1.length+1)//参数不正确时返回空串
return str;
for(j=0;j<i-1;j++)// 将s1.data[0..i-2】复制到str
str.data[j]=s1.data[j];
for(j=0;j<s2.length;j++)//将s2.data[0..s2.length-1】复制到str
str.data[i+j-1]=s2.data[j];
for(j=i-1;j<s1.length;j++)//将s1.data[i-1..s1.length-1]复制到str
str.data[s2.length+j]=s1.data[j];
str.length=s1.length+s2.length;
return str;
}
SqString DelStr(SqString s,int i,int j) //串删去
{
int k;
SqString str;
str.length=0;
if(i<0 || i>s.length || i+j>s.length+1)
return str; //参数不正确时返货空串
for(k=0;k<i-1;k++)
str.data[k]=s.data[k];
for(k=i+j-1;k<s.length;k++)
str.data[k-j]=s.data[k];
str.length=s.length-j;
return str;
}
SqString RepStr(SqString s,int i,int j,SqString t) //串替换
{
int k;
SqString str;
str.length=0;
if(i<0 || i>s.length || i+j-1>s.length)
return str;
for(k=0;k<i-1;k++)
str.data[k]=s.data[k];
for(k=0;k<t.length;k++)
str.data[i+k-1]=t.data[k];
for(k=i+j-1;k<s.length;k++)
str.data[t.length+k-j]=s.data[k];
str.length=s.length-j+t.length;
return str;
}
void DispStr(SqString s) //输出串
{
int i;
if(s.length>0)
{
for(i=0;i<s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
}
void Trans(SqString &s,char c1,char c2)//把s中所有值为c1的字符全部替换为值为c2的字符
{
int i;
for(i=0;i<s.length;i++)
{
if(s.data[i]==c1)
{
s.data[i]=c2;
}
}
}
void Invert(SqString &s)//逆置
{
SqString str;
str.length=0;
int i,j=0;
for(i=s.length-1;i>=0;i--)
{
str.data[j]=s.data[i];
j++;
}
str.length=s.length;
for(i=0;i<str.length;i++)
{
s.data[i]=str.data[i];
}
}
/*SqString str;
str.length=0;
int i,j=0;
for(i=s.length-1;i>=0;i--)
{
str.data[j]=s.data[i];
j++;
}
str.length=s.length;
for(i=0;i<str.length;i++)
{
s.data[i]=str.data[i];
}
*/
void DellChar(SqString &s,char c)//从s中删除所有值为c的字符
{
/*int i;
for(i=0;i<s.length;i++)
{
if(s.data[i]==c)
{
for(int j=i;j<s.length-i;j++)
s.data[j]=s.data[j+1];
s.length--;
}
}
*/
int k=0, i=0; //k记录值等于c的字符个数
while(i<s.length)
{
if(s.data[i]==c)
k++;
else
s.data[i-k]=s.data[i];
i++;
}
s.length -= k;
}
SqString CommonChar(SqString &s1,SqString &s2)//求公共子串
{
/*int i,j,k;
SqString str;
str.length=0;
k=0;
for(i=0;i<s1.length;i++)
{
for(j=0;j<s2.length;j++)
if(s2.data[j]==s1.data[i])
{
k++;
str.data[k]=s1.data[i];
}
}
str.length=k;
return str;
*/
SqString s3;
int i,j,k=0;
for (i=0; i<s1.length; i++)
{
for (j=0; j<s2.length; j++)
if (s2.data[j]==s1.data[i])
break;
if (j<s2.length) //s1.data[i]是公共字符
{
s3.data[k]=s1.data[i];
k++;
}
}
s3.length=k;
return s3;
}
sqString.h
#ifndef SQSTRING_H_INCLUDED
#define SQSTRING_H_INCLUDED
#include <malloc.h>
#define MaxSize 100//最多的字符数字
typedef struct
{
char data[MaxSize];//存放字符串
int length;//存放串长
}SqString;//顺序串类型
void StrAssign(SqString &s,char cstr[]); //字符串常量cstr赋给串s
void StrCopy(SqString &s,SqString t); //串t复制给串s
bool StrEqual(SqString s,SqString t); //判串相等
int StrLength(SqString s); //求串长
SqString Concat(SqString s,SqString t); //串连接
SqString SubStr(SqString s,int i,int j); //求子串
SqString InsStr(SqString s1,int i,SqString s2); //串插入
SqString DelStr(SqString s,int i,int j) ; //串删去
SqString RepStr(SqString s,int i,int j,SqString t); //串替换
void DispStr(SqString s); //输出串
void Trans(SqString &s,char c1,char c2);//把s中所有值为c1的字符全部替换为值为c2的字符
void Invert(SqString &s);//逆置
void DellChar(SqString &s,char c);//从s中删除所有值为c的字符
SqString CommonChar(SqString &s1,SqString &s2);//求公共子串
#endif // SQSTRING_H_INCLUDED
运行结果:
知识点总结:
顺序串的基本算法和删除、替换、倒置等的自定义函数算法