串的操作及其应用

rabbit342 rabbit342 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#include<stdio.h>
#include<stdlib.h>
typedef char ElementType;
#define MaxSize 60
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define NULL 0
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */

typedef struct
{
ElementType data[MaxSize];
int length;// 串长度
}SqString;

void StrAssign(SqString &S,char str[]) //串赋值
{
int i=0;
for(i=0;str[i]!='\0';i++)
S.data[i]=str[i];
S.length=i+1;
}

int StrCompare(SqString &S,SqString &T)//若S>T,则返回值>0;若S=T,则返回值=0;否则返回值<0
{
int i;
for(i=0;i<S.length&&i<T.length;i++)
if(S.data[i]!=T.data[i])
return (S.data[i]-T.data[i]);
return (S.length-T.length);
}

int StrLength(SqString &S) /*返回串的长度*/
{
int i;
for(i=0;(S.data[i])!='\0';i++);
S.length=i;
return S.length;
}

Status Concat(SqString &S,SqString &S1,SqString &S2)//用S返回由串S1和S2联结而成的新串,若未截断,则返回TRUE,否则返回FALSE
{
int i;
if (S1.length+S2.length<=MaxSize)//未截断
{
for(i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=S1.length+S2.length;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return TRUE;
}
else if(S1.length<=MaxSize)//截断S2
{
for (i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=MaxSize;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return FALSE;
}
else//截断S1,或仅取S1
{
for(i=0;i<MaxSize;i++)
S.data[i]=S1.data[i];
S.length=MaxSize;
return FALSE;
}
}

Status SubString(SqString &Sub, SqString &S, int pos, int len)
//用Sub返回串S的第pos个字符起长度为len的子串。其中,1<=pos<=StrLength(S) 且 0<=len<=StrLength(S) -pos + 1 。
{
int i;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
return ERROR;
for(i=pos-1;i<pos+len;i++)
Sub.data[i]=S.data[i];
Sub.length=len;
return OK;
}

Status StrEmpty(SqString &S)//若S为空串,则返回TRUE,否则返回FALSE
{
if(S.length==0)
return TRUE;
else
return FALSE;
}

Status StrCopy(SqString &S,SqString &T) /*由串T复制得串S,若未截断,则返回TRUE,否则返回FALSE*/
{
int i;
if(T.length<=MaxSize)
{
for(i=0;i<T.length;i++)/*将串T的字符赋值给串S*/
S.data[i]=T.data[i];
S.length=T.length; /*将串S的长度赋值给串T*/
return TRUE;
}
else
{
for(i=0;i<MaxSize;i++)
S.data[i]=T.data[i];
S.length=MaxSize;
return FALSE;
}
}

Status StrInsert(SqString &S,int pos,SqString &T)//在串S的第pos个字符之前插入串T
{
int i;
if(pos<1||pos>S.length+1)
return ERROR;//pos不合法
if(S.length+T.length<=MaxSize)
{
for(i=S.length+T.length-1;i>=pos-1+T.length;i--)
S.data[i]=S.data[i-T.length];
for(i=0;i<T.length;i++)
S.data[pos-1+i]=T.data[i];
S.length=S.length+T.length;
return TRUE;
}
else if(pos-1+T.length<=MaxSize)
{
for(i=MaxSize-1;i>pos+T.length-1;i--)
S.data[i]=S.data[i-T.length];
for(i=0;i<T.length;i++)
S.data[pos-1+i]=T.data[i];
S.length=MaxSize;
return FALSE;
}
else
{
for(i=0;i<MaxSize-pos+1;i++)
S.data[pos-1+i]=T.data[i];
S.length=MaxSize;
return FALSE;
}
}

Status StrDelete(SqString &S,int pos,int len)/*从串S中删除第pos个字符起长度为len的子串*/
{
int i;
if(pos<0||len<0||pos+len-1>S.length)
return FALSE;
else
{
for(i=pos+len;i<=S.length-1;i++)
S.data[i-len]=S.data[i];
S.length=S.length-len;
return TRUE;
}
}

void StrClear(SqString &S) /*清空串,只需要将串的长度置为0即可*/
{
S.length=0;
}

int Index(SqString &S,SqString &T,int pos)//若主串S中存在和串T相等的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则返回0
{
int n,m,i;
SqString Sub;
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
i=pos;
for(i=0;i<=n-m+1;i++)
{
SubString(Sub,S,i,m);
if(StrCompare(Sub,T)!=0);
else
return i;
}
}
return FALSE;
}

void DispStr(SqString &S)//打印操作
{
int i;
if (S.length>0)
{
for(i=0;i<S.length;i++)
printf("%c",S.data[i]);
printf("\n");
}
}

Status Replace(SqString &S,SqString &T,SqString &V)//用V替换主串S中出现的所有与T相等的不重叠的子串
{
int i; //从串S的第一个字符起查找串T
if(StrEmpty(T)==NULL) // T是空串
return ERROR;
for(i=1;;i+=StrLength(V))
{
i=Index(S,T,i); // i为从上一个i之后找到的子串T的位置
if(i) // 串S中存在串T
{
StrDelete(S,i,StrLength(T)); // 删除该串T
StrInsert(S,i,V); // 在原串T的位置插入串V
}
}
return OK;
}

void C(SqString &S)
{
char str[MaxSize];
printf("请输入要赋值的字符串:");
gets(str);
getchar();
StrAssign(S,str);
}

void I(SqString &S)
{
int pos;
SqString T;
printf("请输入要插入的起始位置:");
scanf("%d",&pos);
printf("\n");
printf("请输入要插入的字符串:");
gets(T.data);
StrInsert(S,pos,T);
}

void D(SqString &S)
{
int pos,len;
printf("请输入要删除的起始位置:");
scanf("%d",&pos);
printf("\n");
printf("请输入删除长度:");
scanf("%d",&len);
StrDelete(S,pos,len);
}

void R(SqString &S)
{
int pos,len;
SqString T,V;
printf("请输入要置换的起始位置:");
scanf("%d",&pos);printf("\n");
printf("请输入置换长度:");
scanf("%d",&len);
printf("\n");
SubString(T, S, pos,len);
printf("请输入将要换入的字符串:");
gets(V.data);
Replace(S,T,V);
}

void main()
{
char c1;
SqString S;
int i=1;
while(i==1)
{
printf("输入C: 表示要求根据用户输入的以回车为结束符的字符串建立顺序串\n");
printf("输入I:表示要求输入,然后输入插入的起始位置和要插入的字符串\n");
printf("输入D:表示要求删除,然后输入删除的起始位置和删除长度\n");
printf("输入R:表示要求置换,然后输入置换的起始位置、置换长度和将要换入的字符串\n");
printf("输入E:结束串编辑\n");
printf("请选择要实现的功能\n");
c1=getchar();
getchar();
switch(c1)
{
case'C':C(S);
case'I':I(S);
case'D':D(S);
case'R':R(S);
case'E':exit(0);
default:printf("error\n");
}
printf("还进行编辑吗?Y OR N?:");
printf("\n");
c1=getchar();
if(c1=='Y'||c1=='y')
i=1;
else
i=0;
}
printf("该串为:");
DispStr(S);
printf("\n");
}

编译没错,但是就是运行有问题,可以帮忙找出什么问题么?
...全文

相关推荐

串的基本操作及其应用[收集].pdf

串的基本操作及其应用[收集].pdf

czq131452007

数据结构——串实践报告.doc

实 验 报 告 "课程名称: "数据结构实践课 " "实验项目: "定长串存储方法 " "姓 名: " " "专 业: " " "班 级: " " "学 号: " " 计算机科学与技术学院 实验教学中心 2017 年 9 月 23 日 实验项目名称: 串的定长存储表示方法 一、实践目的: 1. 熟练掌握串的定长顺序存储表示方法。 2. 利用串的基本操作实现相关算法。 二、实践内容: 1. 实现串的定长顺序存储表示的基本操作。并用主程序进行多次验证。 2. 设s='abcdefghijk'、t='cde'为两个字符串,利用定长顺序存储结构的串操作,判断 t是否为s的子串。如果是,输出子串所在位置(第一个字符)。编程实现。 3. 已知三个字符串分别为s='ababababcaabcbcaaaaaa',s1='caab', s2='bcb'。利用所 学字符串基本运算的函数得到结果串为:s3='caabcbcaaaaaacaaaaaa'。编程实现。 三、实验用设备仪器及材料 计算机 四、实验原理及接线 五、实验操作步骤 // main4-1.cpp 检验bo4-1.cpp的主程序 // c1

是空空呀

串的存储及其基本操作课程设计,实验报告.doc

串的存储及其基本操作课程设计,实验报告

老帽爬新坡

《数据结构》教案 第三章 串及其应用.docx

《数据结构》教案 第三章 串及其应用.docx《数据结构》教案 第三章 串及其应用.docx《数据结构》教案 第三章 串及其应用.docx《数据结构》教案 第三章 串及其应用.docx《数据结构》教案 第三章 串及其应用.docx《数据结构》教案 第三章 串及其应用.docx《数据结构》教案 第三章 串及其应用.docx《数据结构》教案 第三章 串及其应用.docx

竖子敢尔

数据结构 堆串基本操作代码

数据结构中关于堆串的一系列操作 创建 删除 插入 清空 判空等等 仅供参考

zjj1205
评论 20
收藏 已收藏
分享
返回顶部
rabbit342
数据结构与算法 33,027 成员 35,334 内容