数据结构课程设计+串的基本操作演示.docx
- 文档编号:28550085
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:30
- 大小:146.05KB
数据结构课程设计+串的基本操作演示.docx
《数据结构课程设计+串的基本操作演示.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计+串的基本操作演示.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构课程设计+串的基本操作演示
3.4串的基本操作演示
一、需求分析
1.用堆分配存储表示实现Hstring串类型的最小操作子集。
2.实现串抽象类型的其余基本操作(如联接、删除等),且不能使用c语言本身提供的串函数,必须自己构造新的函数实现串的基本操作。
3.本演示系统是一个命令解释程序,循环往复的处理用户输入的每一条命令,直至终止程序的命令为止。
4.参数的合法性必须严格检查,要严格按照命令的输入格式进行输入,否则程序可能无法正确执行指令。
二、概要设计
实现串的抽象数据类型和实现其基本操作,程序中将涉及下列抽象数据类型:
1.定义串的基本主结构
ADTString{
数据对象:
D={ai|ai∈charcaterset,i=1,2,…,n,n>=0}
数据关系:
R1={
基本操作:
StrCompare(HStringS,HStringT)
初始条件:
S和T是已存在的Hstring类型。
操作结果:
比较其值,显示结果“UNEQUAL”或“EQUAL”。
StrLength(HStringS)
初始条件:
S是已存在的Hstring类型。
操作结果:
返回该串的长度。
Concat(HStringS1,HStringS2)
初始条件:
S1和S2是已存在的Hstring类型。
操作结果:
由S1和S2联接成新串。
Index(HStringS,HStringt)
初始条件:
S和T是已存在的Hstring类型。
操作结果:
显示第二个串在第一个串中首次出现的起始位置。
Replace(HStringM,HStringt,HStringv)
初始条件:
M、t和v是已存在的Hstring类型。
操作结果:
将第一个串中所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。
SubString(HStringS,intpos,intlen)
初始条件:
S是已存在的Hstring类型。
操作结果:
如果参数合法,则显示子串的内部名和串值。
Strprint(HStringS)
初始条件:
S是已存在的Hstring类型。
操作结果:
显示串S的内部名和串值。
getin(intn)
初始条件:
处理命令串S1,
操作结果:
把串值存入串头表中
Insert(intn)
初始条件:
要给指定的串赋值,n为指定的串的内部名
操作结果:
为指定内部名的串赋值
show()
初始条件:
要求查看输入格式
操作结果:
输出各种命令的输入格式
}ADTString
二.存储结构及相应的类型定义
公用头文件header.h
#include
#include
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineMAXLEN100
#defineMAXSIZE50
typedefintStatus;
(1)顺序存储结构
typedefstructResultType
{
intCmdNo;//命令号或命令符
ints[3];//命令的串参数的内部名(最多3)
intnum[2];//命令的数值参数(最多2个)
}ResultType,*Result;
typedefstruct
{char*ch;//若为非空串,则按串长分配存储区,否则ch为NULL
intlength;//串长度
intstate;//状态量
}HString,*String;
typedefstruct
{HStringStrHead[100];//串头数组
intCurNum;//系统中现有的串的数目
}StrHeadList,*StrHead;
三、详细设计
voidStrCompare(HStringS,HStringT)
{//比较两串的串值,显示结果“UNEQUAL”或“EQUAL”
inti;
if(S.length!
=T.length)//先判长度是否相等,若不相等则显示“UNEQUAL”
{printf("“UNEQUAL”\n");return;}
else
{for(i=0;i if(S.ch[i]! =T.ch[i]){printf("“UNEQUAL”\n");return;} } printf("“EQUAL”\n");//比较完后,相等则显示“EQUAL” } voidConcat(HStringS1,HStringS2)//由S1和S2联接成新串 {inti,j; j=KK->CurNum++;//为串头指针分配位置,申请(S1.length+S2.length)大小空间 if((KK->StrHead[j].ch=(char*)malloc((S1.length+S2.length)*sizeof(char)))==NULL)exit(OVERFLOW); for(i=0;i KK->StrHead[j].ch[i]=S1.ch[i]; for(i=0;i KK->StrHead[j].ch[S1.length+i]=S2.ch[i]; KK->StrHead[j].length=S1.length+S2.length;//(S1.length+S2.length)赋值给新串 printf("结果串的内部名和串值为: \n");//显示结果串名和串值 printf("%5d",j); printf("%c",''); printf("'"); for(i=0;i printf("%c",KK->StrHead[j].ch[i]); printf("'"); printf("\n"); } intStrLength(HStringS)//返回S串的长度 { returnS.length; } voidStrprint(HStringS) { inti; printf("%c",''); printf("'"); for(i=0;i printf("%c",S.ch[i]); printf("'"); printf("\n"); } StatusSubString(HStringS,intpos,intlen)//求串S的子串 {inti,n; n=KK->CurNum++;//为串头指针分配位置 if(pos<0||pos>S.length||len<0||len>S.length-pos+1)//判断参数是否合法 { printf("ERROR: 参数不合法\n"); returnERROR; } if(! len)//当子串长度为空 { KK->StrHead[n].ch=NULL; KK->StrHead[n].length=0; } else {//申请len长度的空间存储新串 KK->StrHead[n].ch=(char*)malloc(len*sizeof(char)); for(i=0;i<=len-1;i++) KK->StrHead[n].ch[i]=S.ch[pos-1+i]; KK->StrHead[n].length=len; } printf("子串的内部名和串值为: \n");//显示新串的内部名和串值 printf("%5d",n); Strprint(KK->StrHead[n]); printf("\n"); returnOK; } StatusIndex(HStringS,HStringt) {//显示第二个串在第一个串中首次出现的起始位置 intm,i,j; if(t.length==0)//若t串的长度为0,则参数非法 printf("参数非法\n"); else{ for(i=0;i<=S.length-t.length+1;i++)//查找第二个串在第一个串中首次出现的起始位置 {for(j=i,m=0;m if(m==t.length) {printf("第二个串在第一个串中首次出现的起始位置: \n"); printf("%d\n",i+1); returnOK; } } } if(i>=0)printf("该位置不存在\n");//若找不到 returnERROR; } StatusReplace(HStringM,HStringt,HStringv) {//将第一个串中所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。 inti,j,m,n,k,y=0; n=KK->CurNum++;//为串头指针分配位置 if(M.length<0)returnERROR;//判断 if((KK->StrHead[n].ch=(char*)malloc((M.length)*sizeof(char)))==NULL)exit(OVERFLOW);//申请空间 for(i=0;i KK->StrHead[n].ch[i]=M.ch[i]; KK->StrHead[n].length=M.length; for(i=0;i<=KK->StrHead[n].length-t.length;i++)//新串与串t比较 {for(j=i,m=0;m if(m==t.length)//在新串中找到和串t相等的子串 {y=1; if(t.length>v.length)//串t的长度大于串v,修改新串内容 { for(k=i,m=0;m for(k=i+v.length;k } elseif(t.length==v.length)//串t的长度等于串v,修改新串内容 {for(j=i,m=0;m else//串t的长度小于串v,修改新串内容 {if((KK->StrHead[n].ch=(char*)realloc(KK->StrHead[n].ch,(KK->StrHead[n].length-t.length+v.length)*sizeof(char)))==NULL)exit(OVERFLOW); for(k=KK->StrHead[n].length-t.length+v.length-1,m=KK->StrHead[n].length-1;k>=v.length+i;k--,m--)KK->StrHead[n].ch[k]=KK->StrHead[n].ch[m]; for(k=v.length+i-1,m=v.length-1;m>=0;k--,m--)KK->StrHead[n].ch[k]=v.ch[m]; } KK->StrHead[n].length+=v.length-t.length; i=i+v.length-1; } } printf("结果串的内部名和串值为: \n");//显示新串内容 printf("%5d",n); Strprint(KK->StrHead[n]); printf("\n"); if(y==1)returnTRUE; elsereturnFALSE; } voidshow()//命令输入格式 {printf("输入格式如下: \n"); printf(" (1)赋值。 格式例子: A'hello' printf(" (2)判相等。 格式例子: E'hello''hi' \n"); printf("(3)联接。 格式例子: C'hello''hi' \n"); printf("(4)求长度。 格式例子: L'hello' \n"); printf("(5)求子串。 格式例子: S'hello' printf("(6)子串定位。 格式例子: I'hello''ll' \n"); printf("(7)串替换。 格式例子: R'hello''ll''hli' \n"); printf("(8)显示。 格式例子: 只输入P \n"); printf("(9)删除。 格式例子: 只输入D \n"); printf("(Q)退出。 格式例子: 只输入Q \n"); } StatusInsert(intn)//为指定内部名的串赋值 {inti,j,k=0; chars2[50]; if(s[k]=='\'') {i=0; k++; while(s[k]! ='\'')s2[i++]=s[k++]; } else{printf("格式输入错误! \n");returnERROR;} if(KK->StrHead[n].ch) {KK->StrHead[n].ch=NULL; KK->StrHead[n].length=0; KK->StrHead[n].state=0; } if(! (KK->StrHead[n].ch=(char*)malloc(i*sizeof(char))))exit(OVERFLOW); KK->StrHead[n].length=i; KK->StrHead[n].state=1; for(j=0;j<=i;j++) KK->StrHead[n].ch[j]=s2[j]; returnOK; } voidgetin(intn)//处理命令串,n为要存入的串内部名 {inti,j; while(s1[m]=='')m++;//s1为从键盘接收到的字符串,s1,m为局部变量,在getorder()函数内有效,减少需要传递的参数 if(s1[m]=='\'') {i=0; m++; while(s1[m]! ='\'')s[i++]=s1[m++]; } if(! (KK->StrHead[n].ch=(char*)malloc(i*sizeof(char))))exit(OVERFLOW); KK->StrHead[n].length=i; for(j=0;j<=i;j++) KK->StrHead[n].ch[j]=s[j];//将命令中的串值存入相应的串头表 } 函数的调用关系图(只列出部分) 四、调试分析 #include"header.h" StrHeadKK;//定义StrHead类型的全局变量 voidmain() {charc; inti; Resultp; StatusInitResult(Resultp);//命令分析函数的初始化 Statusgetorder(Resultp);//命令处理函数 voidgetin(intn);//命令串处理函数 voidStrprint();//输出串值 voidshow();//显示输入格式 voidStrCompare(HStringS,HStringT);//串比较函数 voidConcat(HStringS1,HStringS2);//串联接函数 intStrLength(HStringS);//取串长度 StatusSubString(HStringS,intpos,intlen);//取子串 StatusReplace(HStringM,HStringt,HStringv);//子串替换 StatusIndex(HStringS,HStringT);//子串定位 StatusInsert(intn)//为指定内部名的串赋值 KK=(StrHead)malloc(sizeof(StrHeadList));//申请空间 for(i=0;i<=100;i++) {KK->StrHead[i].ch=NULL; KK->StrHead[i].length=0; KK->StrHead[i].state=0; } KK->CurNum=0; p=(Result)malloc(sizeof(ResultType));//申请空间 do{ printf("*********************************************\n"); printf("*串的基本操作演示系统*\n"); printf("*A.进入系统*\n"); printf("*B.输入格式*\n"); printf("*C.退出系统*\n"); printf("*********************************************\n"); scanf("%c",&c); getchar(); switch(c) {case'A': InitResult(p);getorder(p);break; case'B': show();break; case'C': break; default: printf("输入错误,请重新输入! \n");break; } }while(c! ='C'); } chars1[100],s[50];//定义局部变量 intm;//定义局部变量 Statusgetorder(Resultp) { chars1[100],s[50]; inti,j,n,m; do{ printf("请输入指令: \n"); gets(s1); m=0; switch(s1[m])//判断指令类型 {case'A': {while(KK->StrHead[KK->CurNum].state==1)KK->CurNum++;p->s[0]=KK->CurNum++; m++; getin(p->s[0]);//将串值赋入串头表中 printf("新串的内部名和串值为: \n"); printf("%5d",p->s[0]); Strprint(KK->StrHead[p->s[0]]);//回显新串 break } case'E': {m++;//串比较 if(s1[m]=='\0')//比较内部已保存的串 {printf("输入第一个串的内部名: \n"); scanf("%d",&p->s[0]); getchar(); printf("输入第一个串的内部名: \n"); scanf("%d",&p->s[1]); getchar();if(p->s[0]<0||p->s[0]>=KK->CurNum||p->s[1]<0||p->s[1]>=KK->CurNum) printf("超出当前串的范围\n"); else {StrCompare(KK->StrHead[p->s[0]],KK->StrHead[p->s[1]]);} } else{while(KK->StrHead[KK->CurNum].state==1)KK->CurNum++; p->s[0]=KK->CurNum++; while(KK->StrHead[KK->CurNum].state==1)KK->CurNum++; p->s[1]=KK->CurNum++; getin(p->s[0]); m++; getin(p->s[1]); StrCompare(KK->StrHead[p->s[0]],KK->StrHead[p->s[1]]); } break; } case'C': {m++;//串联接 if(s1[m]=='\0')//联接内部已存在的串 {printf("输入第一个串的内部名: \n"); scanf("%d",&p->s[0]); getchar(); printf("输入第二个串的内部名: \n"); scanf("%d",&p->s[1]); getchar(); if(p->s[0]<0||p->s[0]>=KK->CurNum||p->s[1]<0||p->s[1]>=KK->CurNum) printf("超出当前串的范围\n"); else {Concat(KK->StrHead[p->s[0]],KK->StrHead[p->s[1]]);} } else {while(KK->StrHead[KK->CurNum].state==1)KK->CurNum++; p->s[0]=KK->CurNum++; while(KK->StrHead[KK->CurNum].state==1)K
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 基本 操作 演示