数据结构——串实践报告

巡山小妖精
852次浏览
2021年02月11日 04:01
最佳经验
本文由作者推荐

-

2021年2月11日发(作者:悦纳)



成绩:
























课程名称:



数据结构实践课



实验项目:



定长串存储方法








名:









业:









级:









号:







计算机科学与技术学院



实验教学中心




2017






9





23






哈尔滨理工大学计算机科学与技术学院实验教学中心







































实验报告




实验项目名称:



串的定长存储表示方法




一、实践目的:



1.


熟练掌握串的定长顺序存储表示方法。



2.


利用串的基本操作实现相关算法。



二、实践内容:



1.


实现串的定长顺序存储表示的基本操作。并用主程序进行多次验证。



2.



s='abcdefghij k'



t='cde'


为两个字符串, 利用定长顺序存储结构的串操


作,判断


t


是否为


s


的子串。如果是,输出子串所在位置(第一个字符)



编程实现。



3.


已知三个字符串分别为


s=



ababababcaabcbcaaaaaa

< br>’



s1=


< br>caab



, s2=



bcb








< p>
















s3 =



caabcbcaaaaaacaaaaaa



。编程实现。



三、实验用设备仪器及材料



计算机



四、实验原理及接线



五、实验操作步骤



//


检验



的主程序



// c1.h (


程序名


)


#include


#include


#include // malloc()




#include // INT_MAX




#include // EOF(=^Z



F6),NULL


#include // atoi()


#include // eof()






哈尔滨理工大学计算机科学与技术学院实验教学中心







































实验报告



#include // floor(),ceil(),abs()


#include // exit()


// #include // cout,cin


//


函数结果状态代码



#define TRUE 1


#define FALSE 0


#define OK 1


#define ERROR 0


#define INFEASIBLE -1


// #define OVERFLOW -2


因为在


math. h


中已定义


OVERFLOW


的值为< /p>


3,


故去掉此行



typedef int Status; // Status


是函数的类型


,


其值是函数结果状态代码,如


OK




typedef int Boolean; // Boolean


是布尔类型


,


其值是


TRUE


< br>FALSE



// c4-1.h


串的定长顺序存储表示



#define MAXSTRLEN 30 //


用户可在


255


以内定义最大串长(


1


个字节)



typedef char SString[MAXSTRLEN+1]; // 0


号单元存放串的长度




//


串采用定长顺序存储结构


(< /p>



c4-1.h


定义

)


的基本操作


(14


< p>
)


// SString


是数组,故不需引用类 型。此基本操作包括算法


4.2,4.3,4.5


Status StrAssign(SString &T,char *chars)


{






///


生成一个其值等于


chars


的串


T






int i;






if(strlen(chars)>MAXSTRLEN)










return ERROR;






else






{










T[0]=strlen(chars);










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














T[i]=*(chars+i-1);










return OK;






}


}



Status StrCopy(SString T,SString S)


{






///


由串


S


复制得串


T






int i;






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










T[i]=S[i];






return OK;


}



Status StrEmpty(SString S)


{




哈尔滨理工大学计算机科学与技术学院实验教学中心







































实验报告







///



S


为空串


,


则返回


TRUE,


否则返回


FALSE






if(S[0]==0)










return TRUE;






else










return FALSE;


}



int StrCompare(SString S,SString T)


{






///


初始条件


:



S



T

存在







///


操作结果


:



S>T,


则返回值


>0;



S=T,


则返回值


=0;



S


则返回值


<0






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];


}



int StrLength(SString S)


{






///


返回串的元素个数







return S[0];


}



Status ClearString(SString S)


{






///


初始条件

< br>:



S


存在。操作结果


:



S


清为空串







S[0]=0;//


令串长为零







return OK;


}



Status Concat(SString &T,SString S1,SString S2) //


算法


4.2




{






//



T


返回


S1



S 2


联接而成的新串。若未截断,则返回


TRUE


,否则


FALSE






int i;






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];










return TRUE;






}




哈尔滨理工大学计算机科学与技术学院实验教学中心







































实验报告







else






{










//


截断


S2










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;










return FALSE;






}


}



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


{






///



Sub


返回串


S


的第


pos


个字符起长度为


len


的子串。算法


4.3






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;


}



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


{






///


返回子串


T

< br>在主串


S


中第


pos

< p>
个字符之后的位置。若不存在


,


则函数值为


0








///


其中


,T


非空


,1≤pos≤StrLength(S)


。算法


4.5






int i,j;






if(1<=pos&&pos<=S[0])






{










i=pos;










j=1;










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














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


继续比较后继字符















{


















++i;


















++j;














}














else //


指针后退重新开始匹配















{


















i=i-j+2;


















j=1;














}










if(j>T[0])




哈尔滨理工大学计算机科学与技术学院实验教学中心







































实验报告















return i-T[0];










else














return 0;






}






else










return 0;


}



Status StrInsert(SString S,int pos,SString T)


{






//


初始条件


:



S



T


存在


,1≤pos≤StrLength(S)+1







//


操作结果


:


在串

S


的第


pos


个字符之前插入串< /p>


T


。完全插入返回


TRUE,

< p>
部分插入返回


FALSE






int i;






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










return ERROR;






if(S[0]+T[0]<=MAXSTRLEN)






{










///


完全插入











for(i=S[0]; i>=pos; i--)














S[i+T[0]]=S[i];










for(i=pos; i














S[i]=T[i-pos+1];










S[0]=S[0]+T[0];










return TRUE;






}






else






{










///


部分插入











for(i=MAXSTRLEN; i<=pos; i--)














S[i]=S[i-T[0]];










for(i=pos; i














S[i]=T[i-pos+1];










S[0]=MAXSTRLEN;










return FALSE;






}


}



Status StrDelete(SString S,int pos,int len)


{






//


初始条件


:



S


存在


,1≤pos≤StrLength(S)

< p>
-len+1






//


操作结果


:


从串

S


中删除第


pos


个字符起长度为


len


的子串







int i;






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










return ERROR;




哈尔滨理工大学计算机科学与技术学院实验教学中心







































实验报告







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










S[i-len]=S[i];






S[0]-=len;






return OK;



}



Status Replace(SString S,SString T,SString V)


{






//


初始条件


:



S,T



V


存在

,T


是非空串(此函数与串的存储结构无关)







//


操作结果


:

< br>用


V


替换主串


S


中出现的所有与


T


相等的不重叠的子串







int i=1; //


从串


S


的第一个字符起查找串


T






if(StrEmpty(T)) // T


是空串











return ERROR;






do






{










i=Index(S,T,i); //


结果


i


为从上一个


i


之后找到的子串


T


的位置











if(i) //



S


中存在串


T










{














StrDelete(S,i,StrLength(T)); //


删除该串


T














StrInsert(S,i,V); //


在原串


T


的位置插入串


V














i+=StrLength(V); //


在插入的串


V


后面继续查找串


T










}






}






while(i);






return OK;


}



void DestroyString()


{






//


由于


SString

< p>
是定长类型


,


无法销毁



}



void StrPrint(SString T)


{






//


输出字符串


T


。另加

< br>






int i;






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










printf(






printf(


//





printf(


}



int main()


{

-


-


-


-


-


-


-


-