﹜else﹛
i=();j=0
﹜
﹜
if ()return i -T.length;
return-1;
﹜
【函数 2 说明】
函数 eraseS 位(S,T}的功能是删除字符串 S 中所有与 T 相同的子串,其处理过程
为: 首先从字符串 S 的第一个字符(下标为 0)开始查找子串 T,若找到〈得到子串 在 S
中的起始位置),则将串 S 中子串 T 之后的所有字符向前移动,将子串 T 覆盖,从而将 其
删除,然后重新开始查找下一个子串 T,若找到就用后面的宇符序列进行覆盖,重复上述过
程,直到将 S 中所有的子串 T 删除。
例如,若字符串 S 为 “12ab345abab678”、T 为“ab”。第一次找到 "ab" 时(位置为
(2),将 "345abab678 "前移,S 中的串改为"12345abab678" ,第二次找到"ab"时(位置
为 5);将 ab678 前移,S 中的串改为 "12345ab678",第三次找到"ab"时(位置 为 5);
将“678‘前移 ,S 中的串改为 "12345678 "。
【C 函数 2】
Void eraseStr(SString*S,SStringT)
﹛
int i;
int pos;
if (S->length<||T.length<1||S->length
for(i=pos+T.length;ilength;i++) //通过覆盖来删除自串 T
S->str[()]=S->str[i];
S->length=(); //更新 S 所表示串的长度
﹜
﹜
(1)i-j+1
(2)j==T.length
(3)S,T,pos
(4)i-T.length
(5)S ->length -T.length
函数 1 为字符串匹配,算法为:先判断字符串 S 和 T 的长度,如果为空则不用循环,另
外,如果字符串 S 的长度<字符串 T 的长度,那字符串 S 中也不能含有字符串 T,也无需
进行匹配。
那当上述情况都不存在时,即需要进行循环。即从 S 的第一个字符开始,与 T 的第一个
字符进行比较,如果相等,则 S 的第二个字符和 T 的第二字符进行比较,再相等就再往后移
动一位进行比较,依次直到字符串 T 的结尾,也就是说 j=T.length。
当某一个字符与 T 的字符不相等时,那么字符串 S 就应从下一个字符开始比较,此时
i=i-j+1,(如果前面有匹配成功的话,i 的值已经增加了 j 位,因此需要重新回到之前比较
的位置的后一个字符进行比较)再次进行与 T 的第一个字符进行比较,此时 j 恢复初始值,
j=0。
函数 2 为字符串的删除运算。首先,要调用函数 indexStr,需要三个参数,字符串 S、
字符串 T 和 pos。从函数 2 的调用 Void eraseStr(SString*S,SStringT)可以看到,此处
字符串 S 为指针变量,因此字符串前需使用*。
然后删除的字符串的位置为删除初始点的位置到其位置点+字符串 T 的长度,并将后面
的字符串前移。而删除 T 字符串后,字符串 S 的总长度变化,需减去字符串 T 的长度。
试题四(共 15 分)
阅读以下说明和 C 函数,填补函数中的空缺,将解答填入答题纸的对应栏内。
【说明】
简单队列是符合先进先出规则的数据结构,下面用不含有头结点的单向循环链表表示简
单队列。
函数 enqueue(queue *q,KeyType new_elem) 的功能是将元素 new_elem 加入队尾。
函数 Dnqueue(queue *q,KeyType *elem)的功能使将非空队列的队头元素出队(从
队列中删除),并通过参数带回刚出队的元素。
用单向循环链表表示的队列如图 4-1 所示。
图 4-1 单向循环链表表示的队列示意图
队列及链表结点等相关类型定义如下:
enum {errOr, OK};
typedef int KeyType;
typedef struct qNode﹛
KeyType data;
Struct qNode*next;
﹜qNode,*Linkqueue;
Typedef struct﹛
int size;
Link:queue rear;
}queue;