数据结构串的基本操作
西北师范大学计算机科学与工程学院学生实验报告
学号2013710202
17
专业计算机
科学与
技术
班级
软件一班
姓名王尚
课程名称数据结构课程类型专业课
实验名称串的基本操作
实验目的:(1)掌握串的基本操作,即生成一个字符串、联接成一个新串、串的清除等一系列操作。
(2)掌握串的基本意义,学会基本的编程。
实验要求及内容:
实验要求:通过学习串这一小节,掌握其基本的操作要求,能实
生成一个字符串、联接成一个新串、串的清除等一系列操作。
1.ADT
ADT LIST{
数据对象:
数据关系:
StrCopy(&t,s)
初始条件:chars是字符串常量。
操作结果:生成一个其值等于chars的串T。
StrCopy(&T,S)
初始条件:串S存在。
操作结果:若S为空串,则返回TURE,否则返回FAKSE。
StrCompare(s)]
初始条件:串s和T存在。
操作结果:若s>t,则返回值>0;若返回值s=t,则返回值=0;若s 初始条件:串s存在。 操作结果:将s清空串。 2.基本操作的实现 代码如下: #include "stdio.h" #include "string.h" #include "stdlib.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 40 /* 存储空间初始分配量*/ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedef char String[MAXSIZE+1]; /* 0号单元存放串的长度*/ /* 输出字符串T */ void StrPrint(String T) { int i; for(i=1;i<=T[0];i++) printf("%c",T[i]); printf("\n"); } /* 生成一个其值等于chars的串T */ Status StrAssign(String T,char *chars) { int i; if(strlen(chars)>MAXSIZE) return ERROR; else { T[0]=strlen(chars); for(i=1;i<=T[0];i++) T[i]=*(chars+i-1); return OK; } } /* 返回串的元素个数*/ int StrLength(String S) { return S[0]; } /* 初始条件: 串S和T存在*/ /* 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值< 0 */ int StrCompare(String S,String 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]; } /* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */ Status Concat(String T,String S1,String S2) { int i; if(S1[0]+S2[0]<=MAXSIZE) { /* 未截断*/ 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<=MAXSIZE-S1[0];i++) T[S1[0]+i]=S2[i]; T[0]=MAXSIZE; return FALSE; } } /* 用Sub返回串S的第pos个字符起长度为len的子串。*/ Status SubString(String Sub,String 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; } int main() { int i, j, opp; char s; String t,s1,s2,sub; Status k; printf("\n1.生成串\n2.求串长\n3.串比较"); printf("\n4.串连接\n5.求子串"); printf("\n0.退出\n请选择你的操作:\n"); while(opp != '0') { scanf("%d",&opp); switch(opp) { case 1: k=StrAssign(s1,"wangshang"); if(!k) { printf("串长超过MAXSIZE(=%d)\n",MAXSIZE); exit(0); } printf("串s1为:"); StrPrint(s1); printf("\n"); break; case 2: printf("串s1长为%d \n",StrLength(s1)); break; case 3: k=StrAssign(s2,"good"); if(!k) { printf("串长超过MAXSIZE(%d)\n",MAXSIZE); exit(0); } printf("串s2为:"); StrPrint(s2); printf("\n"); i=StrCompare(s1,s2); if(i < 0) s='<'; else if(i==0) s='='; else s='>'; printf("串s1%c串s2\n",s); break; case 4: Concat(t,s1,s2); StrPrint(t); break; case 5: printf("求串s1的子串,请输入子串的起始位置: "); scanf("%d", &i); printf("请输入子串的长度: "); scanf("%d", &j); printf("起始位置:%d,子串长度:%d\n", i, j); k=SubString(sub,s1,i,j); if(k) { printf("子串sub为: "); StrPrint(sub); } break; case 0: exit(0); } } } 运行结果: 实验总结: 通过本次实验,基本掌握了串的基本操作,学会基本的编程,并能调试通过,并为以后的学习打好了基础。 实验评语: 实验成绩教师签名