第四章 串Word文档格式.docx

上传人:b****2 文档编号:4706771 上传时间:2023-05-03 格式:DOCX 页数:15 大小:20.17KB
下载 相关 举报
第四章 串Word文档格式.docx_第1页
第1页 / 共15页
第四章 串Word文档格式.docx_第2页
第2页 / 共15页
第四章 串Word文档格式.docx_第3页
第3页 / 共15页
第四章 串Word文档格式.docx_第4页
第4页 / 共15页
第四章 串Word文档格式.docx_第5页
第5页 / 共15页
第四章 串Word文档格式.docx_第6页
第6页 / 共15页
第四章 串Word文档格式.docx_第7页
第7页 / 共15页
第四章 串Word文档格式.docx_第8页
第8页 / 共15页
第四章 串Word文档格式.docx_第9页
第9页 / 共15页
第四章 串Word文档格式.docx_第10页
第10页 / 共15页
第四章 串Word文档格式.docx_第11页
第11页 / 共15页
第四章 串Word文档格式.docx_第12页
第12页 / 共15页
第四章 串Word文档格式.docx_第13页
第13页 / 共15页
第四章 串Word文档格式.docx_第14页
第14页 / 共15页
第四章 串Word文档格式.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

第四章 串Word文档格式.docx

《第四章 串Word文档格式.docx》由会员分享,可在线阅读,更多相关《第四章 串Word文档格式.docx(15页珍藏版)》请在冰点文库上搜索。

第四章 串Word文档格式.docx

i++)//注意i的取值范围

if(!

StrCompare(SubString(S,i,Strlen(T)),T))//找到了与T匹配的子串

{//分别把T的前面和后面部分保存为head和tail

StrAssign(head,SubString(S,1,i-1));

StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1));

StrAssign(S,Concat(head,V));

StrAssign(S,Concat(S,tail));

//把head,V,tail连接为新串

i+=Strlen(V);

//当前指针跳到插入串以后

n++;

}//if

returnn;

}//Replace

分析:

这一句是必需的,也是容易忽略的.如省掉这一句,则在某些情况下,会引起不希望的后果,虽然在大多数情况下没有影响.请思考:

设S='

place'

T='

ace'

V='

face'

则省掉i+=Strlen(V);

运行时会出现什么结果?

4.13

intDelete_SubString(Stringtype&

s,Stringtypet)//从串s中删除所有与t相同的子串,并返回删除次数

=Strlen(s)-Strlen(t)+1;

StrCompare(SubString(s,i,Strlen(t)),t))

StrAssign(tail,SubString(S,i+Strlen(t),Strlen(s)-i-Strlen(t)+1));

StrAssign(S,Concat(head,tail));

//把head,tail连接为新串

returnn,

}//Delete_SubString

4.14

StatusNiBoLan_to_BoLan(Stringtypestr,Stringtype&

new)//把前缀表达式str转换为后缀式new

Initstack(s);

//s的元素为Stringtype类型

=Strlen(str);

r=SubString(str,i,1);

if(r为字母)push(s,r);

else

if(StackEmpty(s))returnERROR;

pop(s,a);

pop(s,b);

StrAssign(t,Concat(r,b));

StrAssign(c,Concat(t,a));

//把算符r,子前缀表达式a,b连接为新子前缀表达式c

push(s,c);

pop(s,new);

StackEmpty(s))returnERROR;

returnOK;

}//NiBoLan_to_BoLan

基本思想见书后注释3.23.请读者用此程序取代作者早些时候对3.23题给出的程序.

4.15

voidStrAssign(Stringtype&

T,charchars&

#;

)//用字符数组chars给串T赋值,Stringtype的定义见课本

for(i=0,T[0]=0;

chars[i];

T[0]++,i++)T[i+1]=chars[i];

}//StrAssign

4.16

charStrCompare(Stringtypes,Stringtypet)//串的比较,s>

t时返回正数,s=t时返回0,s<

t时返回负数

=s[0]&

=t[0]&

s[i]==t[i];

i++);

if(i>

s[0]&

i>

t[0])return0;

elseif(i>

s[0])return-t[i];

t[0])returns[i];

elsereturns[i]-t[i];

}//StrCompare

4.17

intString_Replace(Stringtype&

=S[0]-T[0]+1;

for(j=i,k=1;

T[k]&

S[j]==T[k];

j++,k++);

T[0])//找到了与T匹配的子串:

分三种情况处理

if(T[0]==V[0])

for(l=1;

l<

=T[0];

l++)//新子串长度与原子串相同时:

直接替换

S[i+l-1]=V[l];

elseif(T[0]<

V[0])//新子串长度大于原子串时:

先将后部右移

for(l=S[0];

l>

=i+T[0];

l--)

S[l+V[0]-T[0]]=S[l];

=V[0];

l++)

else//新子串长度小于原子串时:

先将后部左移

for(l=i+V[0];

=S[0]+V[0]-T[0];

S[l]=S[l-V[0]+T[0]];

S[0]=S[0]-T[0]+V[0];

i+=V[0];

}//String_Replace

4.18

typedefstruct{

charch;

intnum;

}mytype;

voidStrAnalyze(StringtypeS)//统计串S中字符的种类和个数

mytypeT[MAXSIZE];

//用结构数组T存储统计结果

=S[0];

c=S[i];

j=0;

while(T[j].ch&

T[j].ch!

=c)j++;

//查找当前字符c是否已记录过

if(T[j].ch)T[j].num++;

elseT[j]={c,1};

for(j=0;

T[j].ch;

j++)

printf("

%c:

%d\n"

T[j].ch,T[j].num);

}//StrAnalyze

4.19

voidSubtract_String(Stringtypes,Stringtypet,Stringtype&

r[0]=0;

=s[0];

c=s[i];

s[j]!

=c;

t[k]!

t[0])r[++r[0]]=c;

}//Subtract_String

4.20

intSubString_Delete(Stringtype&

=s[0]-t[0]+1;

s[i+j-1]==t[i];

if(j>

m)//找到了与t匹配的子串

for(k=i;

=s[0]-t[0];

k++)s[k]=s[k+t[0]];

//左移删除

s[0]-=t[0];

4.21

LStrNode*next;

}LStrNode,*LString;

//链串结构

voidStringAssign(LString&

s,LStringt)//把串t赋值给串s

s=malloc(sizeof(LStrNode));

for(q=s,p=t->

next;

p;

p=p->

next)

r=(LStrNode*)malloc(sizeof(LStrNode));

r->

ch=p->

ch;

q->

next=r;

q=r;

next=NULL;

}//StringAssign

voidStringCopy(LString&

s,LStringt)//把串t复制为串s.与前一个程序的区别在于,串s业已存在.

for(p=s->

next,q=t->

p&

q;

next,q=q->

p->

ch=q->

pre=p;

while(q)

p=(LStrNode*)malloc(sizeof(LStrNode));

pre->

next=p;

}//StringCopy

charStringCompare(LStrings,LStringt)//串的比较,s>

q&

ch==q->

next);

!

q)return0;

elseif(!

p)return-(q->

ch);

q)returnp->

elsereturnp->

ch-q->

}//StringCompare

intStringLen(LStrings)//求串s的长度(元素个数)

for(i=0,p=s->

next,i++);

returni;

}//StringLen

LString*Concat(LStrings,LStringt)//连接串s和串t形成新串,并返回指针

p=malloc(sizeof(LStrNode));

for(q=p,r=s->

r;

r=r->

next=(LStrNode*)malloc(sizeof(LStrNode));

q=q->

ch=r->

}//for//复制串s

for(r=t->

}//for//复制串t

returnp;

}//Concat

LString*Sub_String(LStrings,intstart,intlen)//返回一个串,其值等于串s从start位置起长为len的子串

q=p;

for(r=s;

start;

start--,r=r->

//找到start所对应的结点指针r

=len;

i++,r=r->

}//复制串t

}//Sub_String

4.22

voidLString_Concat(LString&

t,LString&

s,charc)//用块链存储结构,把串s插入到串t的字符c之后

p=t.head;

while(p&

(i=Find_Char(p,c)))p=p->

//查找字符c

p)//没找到

t.tail->

next=s.head;

t.tail=s.tail;

//把s连接在t的后面

q=p->

r=(Chunk*)malloc(sizeof(Chunk));

//将包含字符c的节点p分裂为两个

j++)r->

ch[j]='

#'

;

//原结点p包含c及其以前的部分

for(j=i;

CHUNKSIZE;

j++)//新结点r包含c以后的部分

ch[j]=p->

ch[j];

//p的后半部分和r的前半部分的字符改为无效字符'

s.tail->

next=q;

//把串s插入到结点p和r之间

}//else

t.curlen+=s.curlen;

//修改串长

s.curlen=0;

}//LString_Concat

intFind_Char(Chunk*p,charc)//在某个块中查找字符c,如找到则返回位置是第几个字符,如没找到则返回0

for(i=0;

CHUNKSIZE&

ch[i]!

if(i==CHUNKSIZE)return0;

elsereturni+1;

}//Find_Char

4.23

intLString_Palindrome(LStringL)//判断以块链结构存储的串L是否为回文序列,是则返回1,否则返回0

InitStack(S);

p=S.head;

i=0;

k=1;

//i指示元素在块中的下标,k指示元素在整个序列中的序号(从1开始)

=S.curlen;

k++)

if(k<

=S.curlen/2)Push(S,p->

ch[i]);

//将前半段的字符入串

elseif(k>

(S.curlen+1)/2)

Pop(S,c);

//将后半段的字符与栈中的元素相匹配

if(p->

=c)return0;

//失配

if(++i==CHUNKSIZE)//转到下一个元素,当为块中最后一个元素时,转到下一块

return1;

//成功匹配

}//LString_Palindrome

4.24

voidHString_Concat(HStrings1,HStrings2,HString&

t)//将堆结构表示的串s1和s2连接为新串t

if(t.ch)free(t.ch);

t.ch=malloc((s1.length+s2.length)*sizeof(char));

=s1.length;

i++)t.ch[i-1]=s1.ch[i-1];

=s2.length;

j++,i++)t.ch[i-1]=s2.ch[j-1];

t.length=s1.length+s2.length;

}//HString_Concat

4.25

intHString_Replace(HString&

S,HStringT,HStringV)//堆结构串上的置换操作,返回置换次数

for(n=0,i=0;

=S.length-T.length;

for(j=i,k=0;

T.length&

S.ch[j]==T.ch[k];

if(k==T.length)//找到了与T匹配的子串:

if(T.length==V.length)

=T.length;

S.ch[i+l-1]=V.ch[l-1];

elseif(T.length<

V.length)//新子串长度大于原子串时:

for(l=S.length-1;

=i+T.length;

S.ch[l+V.length-T.length]=S.ch[l];

for(l=0;

V.length;

S[i+l]=V[l];

for(l=i+V.length;

S.length+V.length-T.length;

S.ch[l]=S.ch[l-V.length+T.length];

S.length+=V.length-T.length;

i+=V.length;

}//HString_Replace

4.26

StatusHString_Insert(HString&

S,intpos,HStringT)//把T插入堆结构表示的串S的第pos个字符之前

if(pos<

1)returnERROR;

if(pos>

S.length)pos=S.length+1;

//当插入位置大于串长时,看作添加在串尾

S.ch=realloc(S.ch,(S.length+T.length)*sizeof(char));

for(i=S.length-1;

=pos-1;

S.ch[i+T.length]=S.ch[i];

//后移为插入字符串让出位置

T.length;

S.ch[pos+i-1]=T.ch[pos];

//插入串T

S.length+=T.length;

}//HString_Insert

4.27

intIndex_New(Stringtypes,Stringtypet)//改进的定位算法

i=1;

j=1;

while(i<

=t[0])

if((j!

=1&

s[i]==t[j])||(j==1&

s[i]==t[j]&

s[i+t[0]-1]==t[t[0]]))

{//当j==1即匹配模式串的第一个字符时,需同时匹配其最后一个

i=i+j-2;

i++;

j++;

}//while

t[0])returni-t[0];

}//Index_New

4.28

voidLGet_next(LString&

T)//链串上的get_next算法

p=T->

succ;

next=T;

q=T;

while(p->

succ)

if(q==T||p->

data==q->

data)

elseq=q->

}//LGet_next

4.29

LStrNode*LIndex_KMP(LStringS,LStringT,LStrNode*pos)//链串上的KMP匹配算法,返回值为匹配的子串首指针

p=pos;

q=T->

q)

chdata==q->

chdata)

=Strlen(T);

}//发现匹配后,要往回找子串的头

returnNULL;

}//LIndex_KMP

4.30

voidGet_LRepSub(StringtypeS)//求S的最长重复子串的位置和长度

for(maxlen=0,i=1;

S[0];

i++)//串S2向右移i格

for(k=0,j=1;

=S[0]-i;

j++)//j为串S2的当前指针,此时串S1的当前指针为i+j,两指针同步移动

if(S[j]==S[j+i])k++;

//用k记录连续相同的字符数

elsek=0;

//失配时k归零

maxlen)//发现了比以前发现的更长的重复子串

lrs1=j-k+1;

lrs2=mrs1+i;

maxlen=k;

//作记录

if(maxlen)

LongestRepeatingSubstringlength:

maxlen);

Position1:

%dPosition2:

lrs1,lrs2);

elseprintf("

NoRepeatingSubstringfound!

\n"

}//Get_LRepSub

i代表"

错位值"

.本算法的思想是,依次把串S的一个副本S2向右错位平移1格,2格,3格,...与自身S1相匹配,如果存在最长重复子串,则必然能在此过程中被发现.用变量lrs1,lrs2,maxlen来记录已发现的最长重复子串第一次出现位置,第二次出现位置和长度.题目中未说明"

重复子串"

是否允许有重叠部分,本算法假定允许.如不允许,只需在第二个for语句的循环条件中加上k<

=i即可.本算法时间复杂度为O(Strlen(S)^2).

4.31

voidGet_LPubSub(StringtypeS,StringtypeT)//求串S和串T的最长公共子串位置和长度

if(S[0]>

=T[0])

StrAssign(A,S);

StrAssign(B,T);

StrAssign(A,T);

StrAssign(B,S);

}//为简化设计,令S和T中较长的那个为A,较短的那个为B

for(maxlen=0,i=1-B[0];

A[0];

if(i<

0)//i为B相对于A的错位值,向左为负,左端

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2