c语言实现定长顺序存储,数据结构C语言版串的定长顺序存储表示及实现.doc

#include

#include

#include

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define OVERFLOW -2

#define MAXSTRLEN 255

typedef int ElemType;

typedef int Status;

typedef unsigned char SString[MAXSTRLEN+1];

//串赋值操作

Status StrAssign(SString T,char chars[]){

// 生成一个其值等于chars的串T

int i;

if(strlen(chars)>MAXSTRLEN)

return ERROR;

T[0]=strlen(chars);

for(i=0;i<=T[0];i++){

T[i+1]=chars[i];}

return OK;

}//StrAssign

//输出串

void StrPrint(SString S){

int i;

for(i=1;i<=S[0];i++){

printf("%c",S[i]);

}

printf("\n");

}//PrnStr

//串复制操作

Status StrCopy(SString T,SString S){

// 由串S复制得串T

int i;

for(i=1;i<=S[0];i++)

T[i]=S[i];

T[0]=S[0];

return OK;

}//StrCopy

//判空操作

Status StrEmpty(SString S){

if(S[0]==0)

return OK;

else

return ERROR;

}//StrEmpty

//串比较操作

int StrCompare(SString S,SString T){

int i;

for(i=1;i<=S[0]&&i<=T[0];++i)

if(S[i]!=T[i])

return S[i]-T[i];

return S[0]-T[0];

}//StrCompare

//求长度操作

int StrLength(SString S){

return S[0];

}//StrLength

//串连接操作

Status Concat(SString T,SString S1,SString S2){

int i;

Status uncut;

if(S1[0]+S2[0]<=MAXSTRLEN){

for(i=1;i<=S1[0];i++){

T[i]=S1[i];}

for(i=1;i<=S2[0];i++){

T[S1[0]+i]=S2[i];}

T[0]=S1[0]+S2[0];

uncut=TRUE;

}

else if(S1[0]

for(i=1;i<=S1[0];i++){

T[i]=S1[i];}

for(i=1;i<=MAXSTRLEN-S1[0];i++){

T[S1[0]+i]=S2[i];}

T[0]=MAXSTRLEN;

uncut=FALSE;

}

else{

for(i=0;i<=MAXSTRLEN;i++){

T[i]=S1[i];}

uncut=FALSE;

}

return uncut;

}//Concat

//取子串操作

Status SubString(SString Sub,SString S,int pos,int len){

int i;

if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)

return ERROR;

for(i=1;i<=len;i++){

Sub[i]=S[pos+i-1];}

Sub[0]=len;

return OK;

}//SubString

//求子串位置操作

int Index(SString S,SString T,int pos){

int i,j;

i=pos;

j=1;

while(i<=S[0]&&j<=T[0]){

if(S[i]==T[j]) {

++i;

++j;

}

else{// 指针后退重新开始匹配

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于定长顺序存储结构实现对串赋值比较子串位置替换操作要求所有操作均以函数的形式实现,在主函数中调用各个函数实现整体功能。 注意:每一个字符的第一个元素存放的是该字符的长度(不包括第一个元素),除赋值外,其他所有操作比较子串位置替换)等都不应包含该字符。 1.1.实验1:赋值函数实现: 按照系统已经定义的函数接口编写函数实体,实现:将输入数组StrInput[]的数据赋值给待赋值数组StrTobeAssigned[],其中待赋值数组StrTobeAssigned[0]存放有效数据的长度,StrTobeAssigned[1]之后存放带赋值数据。 具体要求和相关假设为: ① 函数接口定义为:int MyStrAssign(char * StrTobeAssigned, char * StrInput); ② 输入参数:待赋值字符变量StrTobeAssigned,字符的期望值StrInput; ③ 输出参数:无; ④ 处理规则及返回值:将StrTobeAssigned[1]及之后的内容赋值为StrInput的有效内容,StrTobeAssigned[0]赋值为StrInput有效字符的长度,并返回1; ⑤ 假设: a)两个字符均不为空; b)StrInput存放的是一个完成的字符(不包含长度); c)赞不考虑输入数据超过数组总长度的情况。 1.2实验2:替换函数: 按照系统已经定义的函数接口编写函数实体,实现:在主中MainStr查找是否存在某特定子串SubStr1,若存在则将所有的SubStr1替换为新的指定子串SubStr2,函数返回字符替换的次数。 具体要求和相关假设为: ① 函数接口定义为:int MyStrReplace(char * MainStr, char * SubStr1, char * SubStr2); ② 输入参数:主变量MainStr,子串变量SubStr1,SubStr2; ③ 输出参数:无; ④ 处理规则及返回值:若主中存在子串,用SubStr2替换MainStr中出现的所有与SubStr1相同的不重叠的子串,并返回字符替换的次数;否则返回0。 ⑤ 假设: a)主和两个子串均不为空; b)MainStr[0]和SubStr1[0],SubStr2[0]分别存放对应字符的长度,不用替换该部分。 2.问题分析 (1)根据实验一的内容可知,我们需要通过编写函数实体的形式实现赋值操作,主要的思路包括: (a)获得输入字符的长度len; (b)将输入字符的长度len赋值给待赋值字符的第一个元素StrTobeAssigned[0]; (c)依次将输入字符的数据赋值给待赋值字符。 (2)根据实验二的内容可知,我们需要通过编写函数实体的形式实现替换操作,主要的思路包括: (a)遍历主MainStr,检查是否存在某特定子串SubStr1; (b)如果存在则找到子串在主中的位置; (c)在主中删除该子串并更新主长度; (d)在主中插入该子串并更新主长度; (e)过程中记录替换字符的次数,遍历结束后返回该次数(如果没有替换则为0); 如果有必要,可以使用本实验已经提供的相关函数,如:子串位置的函数MySubStrIndex(),子串删除函数MyStrDelete()和子串插入函数MyStrInsert()等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值