数据结构课程设计+串的基本操作演示.docx

上传人:b****7 文档编号:10991022 上传时间:2023-02-24 格式:DOCX 页数:30 大小:145.15KB
下载 相关 举报
数据结构课程设计+串的基本操作演示.docx_第1页
第1页 / 共30页
数据结构课程设计+串的基本操作演示.docx_第2页
第2页 / 共30页
数据结构课程设计+串的基本操作演示.docx_第3页
第3页 / 共30页
数据结构课程设计+串的基本操作演示.docx_第4页
第4页 / 共30页
数据结构课程设计+串的基本操作演示.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

数据结构课程设计+串的基本操作演示.docx

《数据结构课程设计+串的基本操作演示.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计+串的基本操作演示.docx(30页珍藏版)》请在冰豆网上搜索。

数据结构课程设计+串的基本操作演示.docx

数据结构课程设计+串的基本操作演示

3.4串的基本操作演示

一、需求分析

1.用堆分配存储表示实现Hstring串类型的最小操作子集。

2.实现串抽象类型的其余基本操作(如联接、删除等),且不能使用c语言本身提供的串函数,必须自己构造新的函数实现串的基本操作。

3.本演示系统是一个命令解释程序,循环往复的处理用户输入的每一条命令,直至终止程序的命令为止。

4.参数的合法性必须严格检查,要严格按照命令的输入格式进行输入,否则程序可能无法正确执行指令。

二、概要设计

实现串的抽象数据类型和实现其基本操作,程序中将涉及下列抽象数据类型:

1.定义串的基本主结构

ADTString{

数据对象:

D={ai|ai∈charcaterset,i=1,2,…,n,n>=0}

数据关系:

R1={|ai-1,ai∈D,i=1,2,…,n}

基本操作:

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;iStrHead[j].length;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;mStrHead[n].ch[j]==t.ch[m];m++,j++);

if(m==t.length)//在新串中找到和串t相等的子串

{y=1;

if(t.length>v.length)//串t的长度大于串v,修改新串内容

{

for(k=i,m=0;mStrHead[n].ch[k]=v.ch[m];

for(k=i+v.length;kStrHead[n].length-t.length+v.length;k++)KK->StrHead[n].ch[k]=KK->StrHead[n].ch[k-v.length+t.length];

}

elseif(t.length==v.length)//串t的长度等于串v,修改新串内容

{for(j=i,m=0;mStrHead[n].ch[j]=v.ch[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'\n");

printf("

(2)判相等。

格式例子:

E'hello''hi'或只输入E然后根据提示操作。

\n");

printf("(3)联接。

格式例子:

C'hello''hi'或只输入C然后根据提示操作。

\n");

printf("(4)求长度。

格式例子:

L'hello'或只输入L然后根据提示操作。

\n");

printf("(5)求子串。

格式例子:

S'hello'然后根据提示操作或只输入E提示操作.\n");

printf("(6)子串定位。

格式例子:

I'hello''ll'或只输入I然后根据提示操作。

\n");

printf("(7)串替换。

格式例子:

R'hello''ll''hli'或只输入R然后根据提示操作。

\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模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1