串习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;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--)