串的操作及其应用
#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
数据结构——串实践报告.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
数据结构 堆串基本操作代码
数据结构中关于堆串的一系列操作 创建 删除 插入 清空 判空等等 仅供参考


