串习题

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章串习题

一、例子

例1:从串s1(为顺序存储结构)中第k个字符起求出首次与字符串s2相同的子串的起始位置。

分析:从第k个元素开始扫描s1 ,当其元素值与s2第一个元素值相同时,判断它们之后的元素值是否依次相同,直到s2结束为止。若都相同则返回当前位置值,否则继续上述过程直到s1扫描完为止。

算法如下:

#define MaxStrSize 256

typedef struct {

char ch[MaxStrSize];

int Len;

} SeqString;

int PartPosition(SeqString *s1, SeqString *s2,int k)

{

int i,j;

i=k; /*作为扫描s1的下标*/

j=1; /*作为扫描s2的下标*/

while(i<=s1->len&&j<=s2->len)

if(s1->ch[i]==s2->ch[j])

{i++;j++; }

else

{ i=i-j+2;

j=1;

}

if(j>s2->len)

{ return i-s2->len;}

else

{ return 0;

}

}

例2:从串s中删除所有与串t 相同的子串。

分析:可利用前面题目的函数。从位置1开始调用函数PartPosition(),若找到了相同的子串,则调用删除子串函数DelSubstring()将其删除,再查找后面位置的相同子串,方法与前同。

算法如下:

void DelSubstring(SeqString *s,SeqString *t)

{

int j,k,i=1;

k=1;

while((i<=s->len)&&(k!=0))

{ if(k=PartPosition(s,t,i)>0)

{ for(j=k+t->len;j<=s->len;j++) s->ch[j-t->len]=s->ch[j];

/*删除从k开始的子串*/

s->len=s->len-t->len

/*修改s串的长度*/

i=k;

}

}

s->ch[s->len]=’\0’;

/*赋一个串结束符*/

}

例3:已知S和T是用结点大小为1的单链表存储的两个串,试设计一个算法找出S中第一个不在T中出现的字符。

分析:根据题意,要用到两重循环,从S中取出第一个字符,与T串中的每个字符依次进行比较,如果一直没有遇到相等的字符,则S中取出的字符就是要求的字符,退出循环;若遇到相同的字符,则再从S中取出第二个字符与T中的字符进行比较,依次进行下去。

算法如下:

typedef struct node {

char data;

struct node *next;

}LinkStrNode;

typedef LinkStrNode *LinkString;

char FindChar(LinkString S, LinkString T)

{

LinkStrNode *p,*q;

P=S;

While(p!=NULL)

{q=T;

while(q!=NULL)

{ if(p->data!=q->data)

q=q->next; //继续下一个字符的比较

else

break; //若有相同的字符,跳出内循环

}

if(q==NULL)

{ return p->data; //返回要求的字符

break;

}

p=p->next;

}

return “#”; //没有要求的字符

}

二、算法设计题

1、试写一算法,实现顺序串的比较运算strcmp(S,T),当S>T时,函数

值为1,当S=T时,函数值为0,当S

分析:

算法:

int strcmp(SeqString S,SeqString T)

{

int i=0;

while(i

{

if (S.ch[i]>T.ch[i])

return 1;

else

if(S.ch[i]

return -1;

i++;

}

if(S.len==T.len)

return 0;

else

if(S.len>T.len)

return 1

else

return -1;

}

2、已知采用顺序存储结构的串S,试写一个算法删除S中第i个字符开始的j个字符。

分析:

先判断i和j是否在有效范围内(即i+j

void dele(SeqString *s,int i,int j)

{

int k;

if(i+j-1>S->len)

printf(“i或j超出有效范围”);

else

{

for(k=i+j-1;klen;k++)

S->ch[k-j]=S->ch[k]; //移位删除j个字符。

S->len=S->len-j; //串长度减1

}

}

3、设S和T是两个采用顺序结构存储的串,试写一个算法将串S中的第i个字符开始的j个字符用串T替换。

算法如下:

SeqSAtring *replace(SeqString *S, SeqString *T,int i,int j)

{

int k,l;

k=T->len-j;

if(k>0) //说明T的长度大于被替换的串的长度,因此S串

需要后移

for(l=S->len-1;l>=i+T->len-1;l--)

相关文档
最新文档