数据结构题及c语言版字符串,[转载]数据结构(C语言版)例题(第四章:串)

◆4.10③ 编写对串求逆的递推算法。

要求实现以下函数:

void Reverse(StringType &s);

StringType是串的一个抽象数据类型,它包含以下6种基本操作:

void InitStr(StringType &s);

// 初始化s为空串。

void StrAssign(StringType &t, StringType s);

//

将s的值赋给t。s的实际参数是串变量。

int StrCompare(StringType s, StringType t);

//

比较s和t。若s>t,返回值>0;若s=t,返回值=0;若s<0。

int StrLength(StringType s);

//

返回s中的元素个数,即该串的长度。

StringType Concat(StringType &s, StringType

t);

// 返回由s和t联接而成的新串。

StringType SubString(StringType s, int start, int len);

//

当1<=start<=StrLength(s)且0<=len<=StrLength(s)-

start+1时,

//

返回s中第start个字符起长度为len的子串,否则返回空串。

// 注意,不要使用 " s = "

的形式为 StringType 类型的变量赋值 ,

// 而要使用 StrAssign 函数!!!

void Reverse(StringType

&s)

{ StringType r;

StringType c;

int i;

InitStr(r);

InitStr(c);

for(i=

StrLength(s);i>=1;i--)

{

StrAssign(c,SubString(s,i,1));

Concat(r,c );

}

StrAssign(s,r);

}

◆4.12③ 编写一个实现串的置换操作Replace(&S,T,V)的算法。

要求实现以下函数:

void Replace(StringType &S, StringType T,

StringType V);

StringType是串的一个抽象数据类型,它包含以下6种基本操作:

void InitStr(StringType &s);

// 初始化s为空串。

void StrAssign(StringType &t, StringType s);

//

将s的值赋给t。s的实际参数是串变量。

int StrCompare(StringType s, StringType t);

//

比较s和t。若s>t,返回值>0;若s=t,返回值=0;若s<0。

int StrLength(StringType s);

//

返回s中的元素个数,即该串的长度。

StringType Concat(StringType &s, StringType

t);

// 返回由s和t联接而成的新串。

StringType SubString(StringType s, int start, int len);

//

当1<=start<=StrLength(s)且0<=len<=StrLength(s)-

start+1时,

//

返回s中第start个字符起长度为len的子串,否则返回空串。

// 注意,不要使用 " s = "

的形式为 StringType 类型的变量赋值 ,

// 而要使用 StrAssign 函数!!!

void Replace(StringType

&S, StringType T, StringType V)

{ StringType start;

StringType tail;

int i;

for(i=1;i<=StrLength(S)-StrLength(T)+1;i++)

if(!StrCompare(SubString(S,i,StrLength(T)),T))

{

StrAssign(start,SubString(S,1,i-1));

StrAssign(tail,SubString(S,StrLength(T)+i,StrLength(S)-StrLength(T)-i+1));

Concat(start,V);

StrAssign(S,start);

Concat(S,tail);

i-=1;

}

}

◆4.13③ 编写算法,从串s中删除所有和串t相同的子串。

要求实现以下函数:

void DelSubString(StringType &scrStr, StringType

subStr);

StringType是串的一个抽象数据类型,它包含以下6种基本操作:

void InitStr(StringType &s);

// 初始化s为空串。

void StrAssign(StringType &t, StringType s);

//

将s的值赋给t。s的实际参数是串变量。

int StrCompare(StringType s, StringType t);

//

比较s和t。若s>t,返回值>0;若s=t,返回值=0;若s<0。

int StrLength(StringType s);

//

返回s中的元素个数,即该串的长度。

StringType Concat(StringType &s, StringType

t);

// 返回由s和t联接而成的新串。

StringType SubString(StringType s, int start, int len);

//

当1<=start<=StrLength(s)且0<=len<=StrLength(s)-

start+1时,

//

返回s中第start个字符起长度为len的子串,否则返回空串。

// 注意,不要使用 " s = "

的形式为 StringType 类型的变量赋值 ,

// 而要使用 StrAssign 函数!!!

void DelSubString(StringType

&scrStr, StringType subStr)

{int i,a,b;

a=StrLength(scrStr);

b=StrLength(subStr);

StringType h;

StringType t;

InitStr(h);

InitStr(t);

for(i=1;i<=a-b+1;i++)

if(! StrCompare( SubString (scrStr,i,b),subStr))

{

StrAssign(h,SubString(scrStr,1,i-1));

StrAssign(t,SubString(scrStr,i+b,a-b+1-i));

Concat(h,t);

StrAssign (scrStr,h);

i--;

}

}

◆4.17③ 编写算法,实现串的基本操作Replace(&S,T,V)。

要求采用教科书4.2.1节中所定义的定长顺序存储表示,

但不允许调用串的基本操作。

要求实现以下函数:

Status Replace(SString& s, SString t, SString

v);

定长顺序串SString的类型定义:

typedef unsigned char

SString[MAXSTRLEN+1];

Status Replace(SString& s,

SString t, SString v)

{ int i,j,k,l;

if(!s[0])return FALSE;

for(i=1;i<=s[0]-t[0]+1;i++)

{

for(j=i,k=1;t[k]&&s[j]==t[k];j++,k++);

if(k>t[0])

{

if(t[0]==v[0])

for(l=1;l<=t[0];l++)

s[i+l-1]=v[l];

else if(t[0]

{

for(l=s[0];l>=i+t[0];l--)

s[l+v[0]-t[0]]=s[l];

for(l=1;l<=v[0];l++)

s[i+l-1]=v[l];

}

else

{

for(l=i+v[0];l<=s[0]+v[0]-t[0];l++)

s[l]=s[l-v[0]+t[0]];

for(l=1;l<=v[0];l++)

s[i+l-1]=v[l];

}

s[0]=s[0]-t[0]+v[0];

i+=v[0];

}//if

}//for

return TRUE;

}

◆4.20③ 编写算法,从串s中删除所有和串t相同的子串。

要求实现以下函数:

Status DelSub(SString &s, SString t);

定长顺序串SString的类型定义:

typedef unsigned char SString[MAXSTRLEN+1];

Status DelSub(SString &s,

SString t)

{int i,j,k,n=1,tag;

if(!s[0])return FALSE;

if(s==t){s[0]=0;return TRUE;}

while(n<=s[0]){

i=1;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]+1){

for(k=i;k<=s[0];k++)s[k-t[0]]=s[k];

s[0]-=t[0];tag=1;}n++;}

if(tag)return TRUE;

if(!tag)return FALSE;

}

◆4.26③

采用教科书4.2.2节中所定义的堆分配存储

表示。试写一算法,实现堆存储结构的串的插入操

作StrInsert(&S,pos,T)。

要求实现以下函数:

Status StrInsert(HString &S, int pos, HString

T);

堆串HString的类型定义:

typedef struct {

char

*ch; //

若是非空串,则按串长分配存储区,否则ch为NULL

int length; // 串长度

} HString;

Status StrInsert(HString

&S, int pos, HString

T)

{ int m,k;

if(pos<1||pos>S.length+1)return

ERROR;

if(T.length){

if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))

exit(OVERFLOW);

for(m=S.length-1;m>=pos-1;m--)S.ch[m+T.length]=S.ch[m];

for(k=pos-1;k<=pos+T.length-2;k++)S.ch[k]=T.ch[k-pos+1];

S.length+=T.length; }

return OK;

}

◆4.30⑤

假设以定长顺序存储结构表示串,试设计

一个算法,求串s中出现的第一个最长重复子串及

其位置,并分析你的算法的时间复杂度。

要求实现以下函数:

void CommonStr(SString s, SString &sub, int

&loc);

定长顺序串SString的类型定义:

typedef unsigned char

SString[MAXSTRLEN+1];

void

CommonStr(SString s, SString &sub, int

&loc)

{int i,j,k,max,a,b;

for(max=0,i=1;i

{

for(k=0,j=1;j<=s[ 0 ]-i;j++)

{ if(s[j]==s[j+i]) k++;

else k=0;

if(k>max)

{loc=j-k+1;max=k;}

}

}

a=1;b=loc;

while(a<=max)

{sub[a]=s[b];a++;b++;}

sub[0]=max;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值