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 ( i
{ 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;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;i
for(j=i;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(i
{ 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(i
{ 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