实用数据结构基础参考答案 下载本文

r1->vec[r1->len+i]= '\\0' ; // 添上字符串结束标记 r1->len= r1->len+r2->len ; // 修改新串长度

} }

(2)设x和y两个串均采用顺序存储方式,下面的程序是比较x 和y两个串是否相等的函数,试完成程序填空。

#define MAXLEN 100 typedef struct

{ char vec[MAXLEN]; len; } str; int same (x,y) str *x,*y; { int i=0,tag=1;

if (x->len != y->len) return (0); // (或 <> ) else

{ while ( ilen && tag )

{ if ( x->vec[i] != y->vec[i] ) tag=0 ; i++ ; ( 或 i=i+1 ) } return (tag); } }

(4) 下面算法是判断字符串是否为回文(即正读和倒读相同),试完成程序填空。

#include \typedef struct

{ char vec[MAXLEN]; int len; }str;

void Palindrome (str s) { int i=0;

ing j= s.len-1 ; while ( j-i>=1 )

{ if ( s.vec[i]== s.vec[j] )

{i++; j-- ;continue} // (或 j=j+1 ) else break; }

if ( j-i>=1 )

cout<<\

29

else

cout<<\}

五. 编程题

(1)设下面所用的串均采用顺序存储方式,其存储结构定义如下,请编写下列算法: #define MAXLEN 100 typedef struct

{ char vec[MAXLEN]; int len; } str;

① 将串中r中所有其值为ch1的字符换成ch2的字符。 ② 将串中r中所有字符按照相反的次序仍存放在r中。 ③ 从串r中删除其值等于ch的所有字符。

④ 从串r1中第index个字符起求出首次与字符r2相同的子串的起始位置。 ⑤ 从串r中删除所有与串r3相同的子串(允许调用第(4)小题的函数)。 ⑥ 编写一个比较x 和y两个串是否相等的函数。 解:

①//算法思想:从头至尾扫描r串,对于值为ch1的元素直接替换成ch2即可。

str *trans(r,ch1,ch2) str *r;

char ch1,ch2; { int i;

for(i=0;ilen;i++)

if(r->vec[i]==ch1)

r-vec[i]=ch2;

return(r); }

②//算法思想是:将第一个元素与最后一个元素交换,第二个元素与倒数第二个元

素交换,依次类推,便将该串的所有字符反序了。

str *invert (r) str *r;

{ int i; char x;

for(i=0;i<(r->len%2);i++) { x=r->vec[i];

r->vec[i]=r->[r->len-i+1]; r->vec[r->len-i+1]=x; }

return (r ); }

③//算法思想:从头到尾扫描r串,对于值为ch的元素用移动的方式进行删除。

str *delall(r,ch)

str *r;

30

char ch; { int i,j;

for(i=0;ilen;i++) if(r->vec[i]==ch) {

for(j=i;jlen;j++)

r->vec[i]=r->vec[i+1]; r->len=r->len-1; }

return (r );

}

④//算法思想:从第index个元素开始扫描r1,当其元素值与r2的第一个元素的值

相同时,判定它们之后的元素值是否依次相同,直到r2结束为止,若都相同则返回,否则继续上述过程直到r1扫描完为止。 int partposition(r2,r1,index) str *r2, *r1; int index;

{ int i,j,k;

for(i=index;r1->vec[i];i++)

for(j=i,k=0;r1->vec[j]==r2->vec[k];j++,k++) if(!r2->vec[k+1]) return(i); return(-1); }

⑤算法思想:从位置1开始调用第(4)小题的函数partposition(),若找到了一个

相同子串,则调用delsubstring(),再相同的方法查找后面位置的相同子串。 str *delstringall(r,r3) str *r, *r3; { int i=0;

while(ilen)

{ if(partposition(r,r3,i)!=-1)

delsubstring(r,i,r3->len) i++; }

}

⑥两个串相等的条件是两个串的长度相等,且两个串的对应的字符必须都相同。

int same(x,y) str *x,*y;

{ int i=0,tag=1;

if(x->len!=y->len)

return(0); else

{ while(ilen && tag)

{ if(x->vec[i]!=y->vec[i])

31

tag=0;

i++; }

return(tag); }

}

(2) 设计一算法判断字符串是否为回文(即正读和倒读相同) 解:#include \

typedef struct { char *head; int length; }Hstring;

void isPalindrome(Hstring s) {

int i=0;

int j=s.length-1; while(j-i>=1) {

if (s.head[i]==s.head[j]) {i++; j--; continue;} else break; }

if(j-i>=1)

printf(\ else

printf(\}

(3) 设计一算法从字符串中删除所有与字串\del\相同的子串 解:#include \

#include \typedef struct { char *head;

int length; }Hstring;

char *DeleteSubString(Hstring S,Hstring T) {

int i=0; int j,k;

int Slength=S.length; int Tlength=T.length; char *tail;

while(i<=Slenght-Tlength) {

32