《严蔚敏习题集答案发FTP.pdf》由会员分享,可在线阅读,更多相关《严蔚敏习题集答案发FTP.pdf(125页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、严蔚敏 数据结构(c语言版)习题集算法设计题第一章答案第一章绪论1.16void print_descending(int x,int y,int z)按从大到小顺序输出三个数(scanf(n%d,%d,%d,&x,&y,&z);if(xy;为表示交换的双目运算符,以下同if(yz)yz;if(xy)冒泡排序printf%d%d%d,x,y,z);/print_dcscending1.17Status fib(int k,int m,int&f)求k 阶斐波那契序列的第m 项的值fint tempd;if(k2|m0)return ERROR;if(mk-l)f=0;else if(m=k-l
2、)elsefbr(i=0;i=k-2;i+)tempi=0;tempk-l=l;初始化for(i=k;iv=m;i+)求出序列第k 至第m 个元素的值sum=0;for(j=i-k;ji;j+)sum+=tempj;tempi=sum;f=tempm;return OK;/fib分析:通过保存已经计算出来的结果,此方法的时间复杂度仅为0(m人 2).如果采用递归编程(大多数人都会首先想到递归方法),则时间复杂度将高达O(km).1.18typedef struct char*sport;enum male,female gender;char schoolname;/校名为 A,B,C?D 或
3、 Echar*result;int score;resulttype;typedef struct int malescore;int femalescore;int totalscore;scoretype;void summary(resulttype result)求各校的男女总分和团体总分,假设结果已经储存在result口数组中scoretype score;i=0;while(resulti.sport!=NULL)(switch(resulti.schoolname)(case A*:score 0.totalscore+=resulti.score;if(resulti.gend
4、er=O)score 0.malescore+=resulti.score;else score 0.femalescore+=resulti.score;break;case B:score.totalscore+=resulti.score;if(resiilti.gender=O)score.malescore+=resulti.score;else score.femalescore+=resulti.score;break;i+;fbr(i=O;i5;i+)(printf(School%d:nn,i);printffTotal score of male:%dnn,scorei.ma
5、lescore);printfifTotal score of female:%dnn,scorei.femalescore);printf(Total score of all:%dnn,scorei.totalscore);/suminary1.19Status algol 19(int aARRSIZE)求 i!*2Ai 序列的值且不超过 maxint(last=l;fbr(i=l;i=ARRSIZE;i+)ai-l=last*2*i;if(ai-l/last)!=(2*i)reum OVERFLOW;last=ai-l;return OK;/algol 19分析:当某一项的结果超过了
6、max血 时,它除以前面一项的商会发生异常.1.20void polyvalue()(float ad;float*p=a;printf(Input number of terms:);scan(V%d”,&n);printf(Input the%d coefficients from aO to a%d:nu,n,n);for(i=0;i=n;i+)scanf(n%f,p+);printf(Input value of x:);scanf(”F,&x);p=a;xp=l;sum=0;/xp用于存放x 的 i 次方fbr(i=0;i=n;i-H-)sum+=xp*(*p+);xp*=x;)pr
7、intf(MValue is:%f,sum);/polyvalue第二章线性表2.10Status DeleteK(SqList&a,int i,int k)删除线性表a 中第i 个元素起的k 个元素(if(il|ka.length)return INFEASIBLE;for(count=l;i+count-l v=a.length k;count+)注意循环结束的条件a.elemi+count-l=a.elemi+count+k-1 ;a.length-=k;return OK;/DeleteK2.11Status Insert_SqList(SqList&va,int x)把 x 插入递增
8、有序表 va 中if(va.length+lva.listsize)return ERROR;va.length+;for(i=va.length-l;va.elemix&i=O;i)va.elemi+l=va.elemi;va.elemi+l=x;return OK;/Insert_SqList2.12int ListComp(SqList A,SqList B)比较字符表A 和 B,并用返回值表示结果,值为正,表示AB;值为负,表示A B;值为零,表示A=Bfbr(i=1;A.elemi|B.elemi;i+)if(A.elemi!=B.elemi)return A.elemi-B.ele
9、mi;return 0;/ListComp2.13LNode*Locate(LinkList L,int x)链表上的元素查找,返回指针for(p=l-next;p&p-data!=x;p=p-next);return p;/Locate2.14int Length(LinkList L)求链表的长度fbr(k=O,p=L;p-next;p=p-next,k+);return k;/Length2.15void ListConcat(LinkList ha,LinkList hb,LinkList&hc)把链表 hb 接在 ha 后面形成链表 he(hc=ha;p=ha;while(p-nex
10、t)p=p-next;p-next=hb;/ListConcat2.16见书后答案.2.17Status Insert(LinkList&L,int i,int b)在无头结点链表L 的第i 个元素之前插入元素b(p=L;q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=l)q.next=p;L=q;插入在链表头部elsewhile(-il)p=p-next;q-next=p-next;p-next=q;插入在第i 个元素的位置/Insert2.18Status Delete(LinkList&L,int i)在无头结点链表L 中删除第i 个元素i
11、f(i=l)L=L next;/删 除 第 个元素elseP=L;while(il)p=p-next;p-next=p-next next;删除第 i 个元素/Delete2.19Status Delete_Between(LinkIist&L,int mink,int maxk)/删除元素递增排列的链表 L 中值大于mink且小于maxk的所有元素|p=L;while(p-next-datanext;/p 是最后一个不大于 mink 的元素if(pnext)如果还有比mink更大的元素(q=p-next;while(q-datanext;q 是第一个不小于 maxk 的元素p-next=q;
12、)/Delete_Between2.20Status Delete_Equal(Linklist&L)册 lj除元素递增排列的链表L 中所有值相同的元素(p=L-next;q=p-next;/p,q 指向相邻两元素while(p-next)i f(p-data!=q-data)(p=p-next;q=pnext;当相邻两元素不相等时,p,q都向后推一步)elsewhile(q-data=p-data)(free(q);q=q-next;p-next=q;p=q;q=p-next;当相邻元素相等时删除多余元素/else/while/Delete_Equal2.21void reverse(SqL
13、ist&A)顺序表的就地逆置(fbr(i=l,j=A.length;ij;i+,j-)A.elemiA.elemj;/reverse2.22void LinkList_reverse(Linklist&L)链表的就地逆置;为简化算法,假设表长大于2(p=L-next;q=p-next;s=q-next;p-next=NULL;while(s-next)q-next=p;p=q;q=s;s=s-next;/把 L 的元素逐个插入新表表头q-next=p;s-next=q;L-next=s;/LinkList_reverse分析:本算法的思想是,逐个地把L 的当前元素q 插入新的链表头部,p 为新
14、表表头.2.23void mergel(LinkList&A,LinkList&B,LinkList&C)把链表 A 和 B 合并为 C,A 和 B 的元素间隔排列,且使用原存储空间p=A-ncxt;q=B-next;C=A;while(p&q)|s=p-next;p-next=q;将 B 的元素插入if(s)t=q-next;q-next=s;/如 A 非空,将 A 的元素插入)p=s;q=t;/while/merge 12.24void reverse_merge(LinkList&A,LinkList&B,LinkList&C)把元素递增排列的链表 A 和 B 合并为C,且 C 中元素递
15、减排列,使用原空间(pa=A-next;pb=B-next;pre=NULL;/pa 和 pb 分别指向 A,B 的当前元素while(pa|pb)if(pa-datadata|!pb)pc=pa;q=pa-next;pa-next=pre;pa=q;/A 的元素插入新表)elsepc=pb;q=pb-next;pb-next=pre;pb=q;将 B 的元素插入新表pre=pc;)C=A;A next=pc;构造新表头/reverse_merge分析:本算法的思想是,按从小到大的顺序依次把A 和 B 的元素插入新表的头部pc处,最后处理 A 或 B 的剩余元素.2.25void SqList
16、_Intcrsect(SqList A,SqList B,SqList&C)求元素递增排列的线性表 A 和 B 的元素的交集并存入C 中i=l;j=l;k=O;while(A.elemi&B.elemj)if(A.elcmiB.elemj)j-H-;if(A.elemi=B.elemj)C.elem+k=A.elemi;当发现了 个在A,B中都存在的元素,/就添加到C 中)/while/SqList_Intersect2.26void LinkList_Intersect(LinkList A,LinkList B,LinkList&C)在链表结构上重做上题p=A-next;q=B-next;
17、pc=(LNode*)malloc(sizeof(LNode);whilc(p&q)(if(p-datadata)p=p-next;else if(p-dataq-data)q=q-next;elses=(LNode*)malloc(sizeof(LNode);s-data=p-data;pc-next=s;pc=s;p=p-next;q=q-next;/whileC=pc;/LinkList_Intersect2.27void SqList_Intersect_True(SqList&A,SqList B)求元素递增排列的线性表A 和 B 的元素的交集并存回A 中(i=l;j=l;k=O;w
18、hile(A.elemi&B.elemj)(if(A.elemiB.elemj)j+;else if(A.elemi!=A.elemk)A.elem+k=A.elemi;当发现了 一个在A,B中都存在的元素iH;j+;且 C 中没有,就添加到C 中/whilewhile(A.elemk)A.elemk+=0;/SqList_Intersect_True2.28void LinkList_Intersect_True(LinkList&A,LinkList B)在链表结构上重做上题p=A-next;q=B-next;pc=A;while(p&q)if(p-datadata)p=p-next;el
19、se ifi(p-dataq-data)q=q-next;else if(p-data!=pc-data)pc=pc-next;pc-data=p-data;p=p-next;q=q-next;/while/LinkList_Intersect_T rue2.29void SqList_Intersect_DeIete(SqList&A,SqList B,SqList C)(i=0;j=0;k=0;m=0;7/i指示A 中元素原来的位置,m 为移动后的位置while(iA.length&jB.length&kC.length)if(B.elemjC.elemk)k+;elsesame=B.el
20、emj;找到了相同元素 samewhile(B.elemj=same)j+;while(C.elemk=same)k+;/j,k 后移到新的元素while(iA.length&A.elemisame)A.elemm+=A.elemi+;需保留的元素移动到新位置while(i A ength&A.elemi=same)i ;跳过相同的元素/whilewhile(inext;q=C-next;r=A-ncxt;while(p&q&r)if(p-data(lata)p=p-next;else ifi(p-dataq-data)q=q-next;elseu=p-data;确定待删除元素uwhile(r
21、-next-datanext;确定最后一个小于u 的元素指针rif(r-next-data=u)s=r-next;while(s-data=u)t=s;s=s-next;free(t);确定第一个大于u 的元素指针s/whiler-next=s;/删 除 r 和 s 之间的元素/ifwhile(p-data=u)p=p-next;while(q-data=u)q=q-next;/else/while/LinkList_Intersect_DeIete2.31Status Delete_Pre(CiLNode*s)删除单循环链表中结点s 的直接前驱(p=s;while(p-next-next!=
22、s)p=p next;找 至 lj s 的前驱的前驱 pp-next=s;return OK;/Delete_Pre2.32Status DuLNode_Pre(DuLinkList&L)完成双向循环链表结点的pre域(fbr(p=L;!p-next-pre;p=p-next)p-next-pre=p;return OK;/DuLNode_Pre2.33Status LinkList_Divide(LinkList&L,CiList&A,CiList&B,CiList&C)把单链表 L 的元素按类型分为三个循环链表.CiList为带头结点的单循环链表类型.s=L-next;A=(CiList*
23、)malloc(sizeof(CiLNode);p=A;B=(CiList*)malloc(sizeof(CiLNode);q=B;C=(CiList*)malloc(sizeof(CiLNode);r=C;/建立头结点while(s)iftisalphabet(s-data)p-next=s;p=s;else if(isdigit(s-data)q-next=s;q=s;else|r-next=s;r=s;/whilep-next=A;q-next=B;r-next=C;完成循环链表/LinkList_Divide2.34void Print_XorLinkedList(XorLinkedL
24、ist L)从左向右输出异或链表的元素值p=L.left;pre=NULL;while(p)(printf(%d,p-data);q=XorP(p-LRPtr,pre);pre=p;p=q;/任何一个结点的LRPtr域值与其左结点指针进行异或运算即得到其右结点指针)/Print_XorLinkedList2.35Status Insert_XorLinkedList(XorLinkedList&L,int x,int i)在异或链表 L 的第 i 个元素前插入元素 x(p=L.left;pre=NULL;r=(XorNode*)malloc(sizeof(XorNodc);r-data=x;i
25、f(i=l)/当插入点在最左边的情况p-LRPtr=XorP(p.LRPtr,r);r-LRPtr=p;L.left=r;return OK;j=l;q=p-LRPtr;当插入点在中间的情况while(+jLRPtr,pre);pre=p;p=q;/while 在p,q两结点之间插入if(!q)return INFEASIBLE;/i 不可以超过表长p-LRPtr=XorP(XorP(p-LRPtr,q),r);q-LRPtr=XorP(XorP(q-LRPtr,p),r);r-LRPti=XorP(p,q);修改指针return OK;/Insert_XorLinkedList2.36Sta
26、tus Delete_XorLinkedList(XorlinkedList&L,int i)删除异或链表 L 的第 i 个元素p=L.left;pre=NULL;if(i=1)/删除最左结点的情况q=p-LRPtr;q-LRPtr=XorP(q-LRPtr,p);L.left=q;free(p);return OK;j=l;q=p-LRPtr;while(+jLRPtr,pre);pre=p;p=q;/while 找到待删结点qif(!q)return INFEASIBLE;/i 不可以超过表长if(L.right=q)/q为最右结点的情况(p-LRPtr=XorP(p-LRPtr,q);L
27、.right=p;free(q);return OK;r=XorP(q-LRPtr,p);/q为中间结点的情况,此时p,r分别为其左右结点p-LRPtr=XorP(XorP(p-LRPtr,q),r);r-LRPtr=XorP(XorP(r-LRPtr,q),p);修改指针free(q);return OK;/Delete_XorLinkedList2.37void OERefbrm(DuLinkedList&L)按1,3,5,.4,2的顺序重排双向循环链表L 中的所有结点p=L.next;while(p-next!=L&p-next-next!=L)(p-next=p-next-next;p
28、=p-next;/此时p 指向最后个奇数结点if(p-next=L)p-next=L-pre-pre;else p-next=l-pre;p=p-next;此时p 指向最后个偶数结点while(p-pre-pre!=L)p-next=p-pre-pre;p=p-next;p next=L;/按题目要求调整了 next链的结构,此时pre链仍为原状fbr(p=L;p-next!=L;p=p-next)p-next-pre=p;L-pre=p;调整pre链的结构,同 2.32方法/OERefbnn分析:next链和pre链的调整只能分开进行.如同时进行调整的话,必须使用堆栈保存偶数结点的指针,否则
29、将会破坏链表结构,造成结点丢失.2.38DuLNode*Locate_DuList(DuLinkedList&L,int x)带 freq 域的双向循环链表上的查找p=L.next;while(p.data!=x&p!=L)p=p-next;ifp=L)return NULL;没找至ljp-freq+;q=p-pre;while(q-freqfreq)q=q-pre;/查找插入 彳 立 置if(q!=p-pre)(p-pre-next=p-next;p-next-pre=p-pre;q-next-pre=p;p-next=q-next;q-next=p;p-pre=q;调整位置return p
30、;/Locate_DuList2.39float GetValue_SqPoly(SqPoly P,int x0)求升事顺序存储的稀疏多项式的值(PolyTerm*q;xp=l;q=P.data;sum=0;ex=0;while(q-coef)while(exexp)xp*=xO;sum+=q-coeP*cxp;q ;)return sum;/GetValue_SqPoly2.40void Subtract_SqPoly(SqPoly Pl,SqPoly P2,SqPoly&P3)求稀疏多项式 Pl 减 P2 的差式 P3(PolyTerm*p,*q,*r;Create_SqPoly(P3);
31、/建立空多项式 P3p=P 1 .data;q=P2.data;r=P3.data;while(p-coef&q-coef)(if(p-expexp)r-coef=p-coef;r-exp=p-exp;p+;r+;else if(p-expexp)r-coef=-q-coef;r-exp=q-exp;q+;r+;elseif(pcoefqcoef)!=0)只有同次项相减不为零时才需要存入P 3中(r-coef=p-coef-q-coef;r-exp=p-exp;r+;/ifP-;q+;/else/whilewhile(p-coef)处理P l或 P 2的剩余项r-coef=p-coef;r-e
32、xp=p-exp;p-H-;r+;while(q-coef)r-coef=-q-coef;r-exp=q-exp;/Subtract_SqPoly2.41void QiuDao_LinkedPoly(LinkcdPoly&L)对有头结点循环链表结构存储的稀疏多项式L 求导p=L-next;if(!p-data.exp)L-next=p-next;p=p-next;跳过常数项)while(p!=L)p-data.coef*=p-data.exp;对每项求导p=p-next;)/QiuDao_LinkedPoly2.42void Divide_LinkedPoly(LinkedPoly&L,&A,
33、&B)把循环链表存储的稀疏多项式L 拆成只含奇次项的A 和只含偶次项的Bp=L-next;A=(PolyNode*)malloc(sizeof(PoIyNode);B=(PolyNode*)malloc(sizeof(PolyNode);pa=A;pb=B;while(p!=L)if(p-data.exp!=2*(p-data.exp/2)pa-next=p;pa=p;elsepb-next=p;pb=p;)p=p-next;/whilepa-next=A;pb-next=B;/Divide_LinkedPoly第 三 章 栈与队列3.15typedef struct Elcmtype*bas
34、e2;Elemtype*top2;BDStacktype;双向栈类型Status Init_Stack(BDStacktype&tws,int m)初始化一个大小为 m 的双向栈 tws(tws.base0=(Elemtype*)malloc(sizeof(Elemtype);tws.base 1 =tws.baseO+m;tws.top0=tws.base0;tws.topl=tws.basel;return OK;/Init_StackStatus push(BDStacktype&tws,int i,Elemtype x)/x 入栈,i=0 表示低端栈,i=l 表示高端栈if(tws.t
35、op0tws.topl)return OVERFLOW;/注意此时的栈满条件if(i=0)*tws.top0+=x;else if(i=l)*tws.topl=x;else return ERROR;return OK;/pushStatus pop(BDStacktype&tws,int i,Elemtype&x)/x 出栈,i=0 表示低端栈,i=l 表示高端栈if(i=0)if(tws.top0=tws.base0)return OVERFLOW;x=*tws.top0;else if(i=l)ifi(tws.top 1 =tws.base 1 )return OVERFLOW;x=*-
36、H-tws.topl;)else return ERROR;return OK;pop3.16void Train_arrange(char*train)这里用字符串train表示火车,H 表示硬席,S,表示软席|p=train;q=train;InitStack(s);while(*p)(if(*p=H)push(s,*p);把H 存入栈中else*(q+尸*p;把S 调到前部p+;while(!StackEmpty(s)(pop(s,c);*(q+)=c;把H 接在后部/Train_arrange3.17int IsReverse。/判断输入的字符串中前和&后部分是否为逆串,是则返回1,否
37、则返回0(InitStack(s);while(e=getchar()!-&,)push(s,e);while(e=getchar()!-r)(ifi(StackEmpty(s)return 0;pop(s,c);if(e!=c)return 0;if(!StackEmpty(s)return 0;return 1;/IsReverse3.18Status Bracket_Test(char*str)判别表达式中小括号是否匹配count=0;for(p=str;*p;p4-+)(if(*p=-(,)count+;else iR*p=)count;if(countl)if(gx-ly=old)g
38、x-ly=color;EnQueue(Q,x-l,y);修改左邻点的颜色if(yi)if(gxy-l=old)gxy-l=color;EnQueue(Q,x,y-l);修改上邻点的颜色if(xm)if(gx+ly=old)gx+ly=color;EnQueue(Q,x+l,y);修改右邻点的颜色if(y=0)s=0;else if(m0&n=0)s=n+g(m-l,2*n);else return ERROR;return OK;/g3.25Status F_recursive(int n,int&s)递归算法if(n0)return ERROR;ifln=0)s=n+1;elseF_recu
39、rve(n/2,r);s=n*r;return OK;/F_recursiveStatus F_nonrecursive(int n,int s)非递归算法if(n0)return ERROR;if(n=0)s=n+l;else(InitStack(s);/s 的元素类型为 struct int a;int b;while(n!=0)a=n;b=n/2;push(s,a,b);n=b;/whiles=l;while(!StackEmpty(s)pop(s,t);s*=t.a;/while)return OK;/F_nonrecursive3.26float Sqrt_recursive(flo
40、at A,float p,float e)求平方根的递归算法if(abs(pA2-A)=e)p=(p+A/p)/2;return p;/Sq第四章串4.10void String_Reverse(Stringtype s,Stringtype&r)求 s 的逆串 rStrAssign(rJ);初始化r 为空串fbr(i=Strlen(s);i;i-)(StrAssign(c,SubString(s,i,1);StrAssign(r,Concat(r,c);把 s 的字符从后往前添加到r 中/String_Re verse4.11void String_Subtract(Stringtype s
41、,Stringtype t,Stringtype&r)求所有包含在串 s 中而 t 中没有的字符构成的新串r(StrAssign(r,H);fbr(i=1 ;iStrlen(t)StrAssign(r,Concat(r,c);/fbr/String_Subtract4.12int Replace(Stringtype&S,Stringtype T,Stringtype V);将串 S 中所有子串 T 替换为 V,并返回置换次数fbr(n=O,i=l;i=Strlen(S)-Strlen(T)+l;i+)注意 i 的取值范围if(!StrCompare(SubString(S,i,Stiien(
42、T),T)找 至 IJ了与 T 匹配的子串 分别把T 的前面和后面部分保存为head和 tailStrAssign(head,SubString(S,1StrAssign(tail,SubStrmg(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+l);StrAssign(S,Concat(head,V);StrAssign(S,Concat(S,tail);/把 head,V,tail 连接为新串i+=Strlen(V);/当前指针跳到插入串以后n+;/ifreturn n;/Replace分析:i+=Strlen(V);这一句是必需的,也是容易忽略的.如省掉这一句,
43、则在某些情况下,会引起不希望的后果,虽然在大多数情况下没有影响.请思考:设S=place,T=ace,V=,face;则省掉i+=Strlen(V);运行时会出现什么结果?4.13int Delete_SubString(Stringtype&s,Stringtype t)从串s 中删除所有与t 相同的子串,并返回删除次数(fbr(n=O,i=1 ;i=Strlen(s)-Strlen(t)+1 ;i+)if(!StrCompare(SubString(s,i,Strlen(t),t)(StrAssign(head,SubString(S,1 ,i-1);StrAssign(tail,SubS
44、tring(S,i+Strlen,Strlen(s)-i-Strten(t)+l);StrAssign(S,Concat(head,tail);/JE head,tail 连接为新串n-H-;/ifreturn n,/Delete_SubString4.14Status NiBoLan_to_BoLan(Stringtype str,Stringtype&new)把前缀表达式 str 转换为后缀式newInitstack(s);/s 的元素为 Stringtype 类型fbr(i=l;it 时返回正数,s=t 时返回 O,st 时返回负数(fbr(i=l;i=sO&isO&itO)return
45、 0;else if(isO)returnelse if(itO)return si;else return si-ti;/StrCompare4.17int String_Replace(Stringtype&S,Stringtype T,Stringtype V);将串 S 中所有子串 T 替换为 V,并返回置换次数(for(n=0,i=1 ;iT0)找到了与T 匹配的子串:分三种情况处理if(T0=V0)for(l=l;l=T0;1+)新子串长度与原子串相同时:直接替换Si+l-l=Vl;else if(T0vV0)新子串长度大于原子串时:先将后部右移fbr(l=S0;l=i+T0;l-
46、)S1+VO-TO=S1;fbr(l=l;l=VO;l-H-)Si+l-l=Vl;else/新子串长度小于原子串时:先将后部左移fbr(l=i+VO;K=SO+VO-TO;l+)S1=S1-VO+TO;for(l=l;l=VO;l-H-)Si+l-l=Vl;)SO=SO-TO+VO;i+=VO;n+;/if/fbrreturn n;/String_Replace4.18typedef struct char ch;int num;mytype;void StrAnalyze(Stringtype S)/统计串S 中字符的种类和个数mytype TMAXSIZE;用结构数组T 存储统计结果for
47、(i=l;i=SO;i+)(c=Si;j=O;while(T|j.ch&Tj.ch!=c)j+;查找当前字符c 是否已记录过if(TU.ch)TU.num+;else Tj=c,l;/fdrforG=O;TU.ch;j+)printf(%c:%dnH,Tj.ch,Tj.num);/StrAnalyze4.19void Subtract_String(Stringtypc s,Stringtype t,Stnngtypc&r)求所有包含在串 s 中而 t 中没有的字符构成的新串rr0=0;fbr(i=1;i=sOc=si;fora=l;ji&sj!=c;j+);判断s 的当前字符c 是否第一次出
48、现if(i=j)for(k=l;ktO)r+rO=c;/for/Subtract_String4.20int SubString_Delete(Stringtype&s,Stringtype t)从串s 中删除所有与t 相同的子串,并返回删除次数fbr(n=0,i=l;i=s0-t0+l;i+)(for(j=l;jm)/找到了与t 匹配的子串for(k=i;knext;p;p=p-next)r=(LStrNode*)malloc(sizeof(LStrNode);r-ch=p-ch;q-next=r;q=r;q-next=NULL;/String Assignvoid StringCopy(L
49、String&s,LString t)把串t 复制为串s.与前一个程序的区别在于,串s 业已存在.fbr(p=s-next,q=t-next;p&q;p=p-next,q=q-next)p-ch=q-ch;pre=p;while(q)p=(LStrNode*)malloc(sizeof(LStrNode);p-ch=q-ch;pre-next=p;pre=p;)p-next=NULL;/StringCopychar StringCompare(LString s,LString。串的比较,st时返回正数,s=t时返回O,snext,q=t-next;p&q&p-ch=q-ch;p=p-next
50、,q=q-next);if(!p&!q)return 0;else if(!p)return-(q-ch);else if(!q)return p-ch;else return p-ch-q-ch;/StringCompareint StringLen(LString s)求串s 的长度(元素个数)(fbr(i=O,p=s-next;p;p=p-next,i+);return i;/StringLenLString*Concat(LString s,LString t)连接串s 和串t 形成新串,并返回指针(p=malloc(sizeof(LStrNode);fbr(q=p,r=s-next;