阅读以下说明,回答问题1~5,将解答填入对应的解答栏内。[说明] 若s和t是用单链表存储的两个串,设计一个函数将s串中首次与串t匹配的字串逆置。linkstring * invert - substring ( s, t)linkstring * s, * t;{linkstring *prior, *p, *t1, *r, *q, *u;prior =s;p=s;t1 =t;if ( (1) ) printf ( "error\n") ;else{while { p ! = NULL t1! = NULL){if ( p- >data = = t1 - >data){p = p- >link;t1 = t1- >link;}else{(2)p = prior - > link;}t1 = t- >link;}if ( t1 ! : NULL) printf ("cannot find");else{(3)r = q- >link;q- >link = p;while (r ! = p){u = r- >link;(4)q=r;r = u;}(5)}}}
阅读以下说明,回答问题1~5,将解答填入对应的解答栏内。
[说明] 若s和t是用单链表存储的两个串,设计一个函数将s串中首次与串t匹配的字串逆置。
linkstring * invert - substring ( s, t)
linkstring * s, * t;
{
linkstring *prior, *p, *t1, *r, *q, *u;
prior =s;
p=s;
t1 =t;
if ( (1) ) printf ( "error\n") ;
else
{
while { p ! = NULL && t1! = NULL)
{
if ( p- >data = = t1 - >data)
{
p = p- >link;
t1 = t1- >link;
}
else
{
(2)
p = prior - > link;
}
t1 = t- >link;
}
if ( t1 ! : NULL) printf ("cannot find");
else
{
(3)
r = q- >link;
q- >link = p;
while (r ! = p)
{
u = r- >link;
(4)
q=r;
r = u;
}
(5)
}
}
}
相关考题:
下列程序中的函数 strcpy2() 实现字符串两次复制 , 即将 t 所指字符串复制两次到 s 所指内存空间中 ,合并形成一个新的字符串。例如,若 t 所指字符串为 efgh ,调用 strcpy2 后, s 所指字符串为 efghefgh 。请填空。#include stdio.h#include string.hvoid strcpy2(char *s,char *t){ char *p=t;while(*s++=*t++);s= 【 1 5 】 ;while( 【 1 6 】 =*p++);}main(){ char str1[100]="abcd",str2[]="efgh";strcpy2(str1 ,str2); printf("%s\n",str1);}
试题四(共 15分)阅读以下说明和C函数,将解答填入答题纸的对应栏内。【说明】函数del_substr(S,T)的功能是从头至尾扫描字符串 S, 删除其中与字符串T相同的所有子串,其处理过程为:首先从串 S 的第一个字符开始查找子串 T,若找到,则将后面的字符向前移动将子串T覆盖掉,然后继续查找子串T,否则从串S的第二个字符开始查找,依此类推,重复该过程,直到串S的结尾为止。该函数中字符串的存储类型 SString定义如下:typedef struct {char *ch; /*串空间的首地址*/int length; /*串长*/}SString;【C函数】void del_substr(SString *S, SString T){int i, j;if ( S-length 1 || T.length 1 || S-length T.length )return;i = 0; /* i为串S中字符的下标 */for ( ; ; ) {j = 0; /* j为串T中字符的下标 */while ( i S-length j T.length ) { /* 在串S中查找与T相同的子串 */if ( S-ch[i]==T.ch[j] ) {i++; j++;}else {i = (1) ; j = 0; /* i值回退,为继续查找T做准备 */}}if ( (2) ) { /* 在S中找到与T相同的子串 */i = (3) ; /* 计算S中子串T的起始下标 */for(k = i+T.length; kS-length; k++) /* 通过覆盖子串T进行删除 */S-ch[ (4) ] = S-ch[k];S-length = (5) ; /* 更新S的长度 */}else break; /* 串S中不存在子串T*/}}
●试题四阅读下列程序说明和C程序,将应填入(n)处的字句写在答卷纸的对应栏内。【程序说明】该程序定义了两个子函数strsort和strmerge。它们分别实现了将一个字符串按字母顺序排序和将两个字符串合并排序,并删去相同字符。在主函数里,先输入两个字符串s1和s2,然后调用strsort函数对它们分别排序,然后调用strmerge函数将s1和s2合并,将合并后的字符串赋给字符串s3,最后输出字符串s3。【程序】#includestdio.hvoid strmerge(char*a,char*b,char*c)//将字符串a,b合并到字符串c中{char t,*w;w=c;while( (1) ){//找到字符串a,b当前字符中较小的字符if(*a*b){t=*a;(2) ;}else if(*a*b){t=*b;(3) ;}else//字符串a,b当前字符相等{t=*a;a++;b++;}if( (4) )//开始,可直接赋值*w=t;else if(t!=*w)//如果a,b中较小的当前字符与c中当前字符不相等,才赋值 (5) ;}if(*a!=\′\0′)//如果字符串a还没有结束,则将a的剩余部分赋给cwhile(*a!=′\0′)if(*a!=*w){*(++w)=*a;a++;}else(6) ;if(*6!=′\0′)//如果字符串b还没有结束,则将b的剩余部分赋给cwhile(*b!=′\0′)if(*b!=*w){*(++w)=*b;b++;}elseb++;(7) ;}void strsort(char*s)//将字符串S中的字符排序{int i,j,n;char t,*w;W=S;for(n=0;*w!=′\0′;n++)//得到字符串长度nw++;for(i=0;in-1;i++)//对字符串s进行排序,按字母先后顺序for(j=i+1;jn;j++)if( (8) ){t=s[i];s[i]=s[j]; (9) ;}}void main(){char s1[100],s2[100],s3[100];printf("\nPlease,input the first string:");scanf("%s",s1);printf("\nPlease input the second string:");scanf("%s",s2);strsort(s1);//将字符串s1排序strsort(s2);//将字符串s2排序printf("%s\n",s1);printf("%s\n",s2);s3[0]=′\0′;//字符串s3的第一个字符先置′\0′结束标志(10) //将s1和s2合并,按照字母顺序排列,//且要删去相同字符,存入s3中printf("%s",s3);}
●试题二阅读下列程序或函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。【函数2.1说明】函数strcmp()是比较两个字符串s和t的大小。若s<t函数返回负数;若s=t函数返回0;若s>t,函数返回正数。【函数2.1】int strcmp(char *s,char *t){ while(*s *t (1) ){s++;t++;}return (2) ;}【程序2.2说明】在n行n列的矩阵中,每行都有最大的数,本程序求这n个最大数中的最小一个。【程序2.2】#includestdio.h#define N 100int a[N][N];void main(){ int row ,col,max,min,n;/*输入合法n(<100),和输入n×n个整数到数组a的代码略*/for (row=0;row<n;row++){for(max=a[row][0],col=1;col<n;col++)if( (3) )max=a[row][col];if( (4) )min=max;else if( (5) )min=max;}printf ("The min of max numbers is %d\n",min);}
下面函数的功能是()sss(s,t)char*s,*t;{ while((*s)&&(*t)&&(*t++==*s++));return(*s- * t); }A.求字符串的长度B.比较两个字符串的大小C.将字符串s复制到字符串t中D.将字符串s接续到字符串t中
试题二(共15分)阅读以下说明和C函数,将应填入 (n) 处的语句或语句成分写在答题纸的对应栏内。【说明1】 函数deldigit(char *s) 的功能是将字符串s中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与 s 等长的临时字符串空间并令t指向它,将非数字字符按次序暂存入该空间,最后再拷贝给s。【C函数】void deldigit(char *s){char *t = (char *)malloc( (1) ); /*申请串空间*/int i, k = 0;if (!t) return;for(i = 0; i strlen(s); i++)if ( !(*(s+i)='0' *(s+i)='9') ) {t[k++] = (2) ;}(3) = '\0'; /*设置串结束标志*/strcpy(s,t);free(t);}【说明2】函数reverse(char *s, int len)的功能是用递归方式逆置长度为 len的字符串s。例如,若串s的内容为“abcd” ,则逆置后其内容变为“dcba” 。【C函数】void reverse(char *s, int len){char ch;if ( (4) ){ch = *s;*s = *(s+len-1);*(s+len-1) = ch;reverse( (5) );}}
阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。[说明]若S和T是用结点大小为1的单链表存储的两个串,试设计一个算法找出S中第一个不在T中出现的字符。查找过程是这样的,取S中的一个字符(结点),然后和T中所有的字符一一比较,直到比完仍没有相同的字符时,查找过程结束,否则再取S中下一个字符,重新进行上述过程。[函数]typedef struct node {char data;struct node *next;}LinkStrNode; //结点类型typedef LinkStrNode *LinkString; //LinkString 为链串类型LifikString S; //S 是链串的头指针char SearchNoin ( LinkString S, LinkString T ){//查找不在T中出现的字符LinkStrNode *p, *q;(1);q=T;while ((2)){//取S中结点字符while((3))//进行字符比较q=q->next;if(q==NULL) return (4);//找到并返回字符值q=T;//指针恢复串T的开始结点((5));}printf("there's no such character.");return NULL:}
阅读以下说明和C语言函数,将应填入(n)处的语句写在对应栏内。【说明】设串s和串t采用顺序存储结构,编写函数实现串s和串t的比较操作,要求比较结果包括大于、小于和等于3种情况。【函数】int StrCompare(SStrType s, SStrType t){int n=s.length, m=(1), i,j,tag;i=0; j=0;while((2)){if((3)){i++;j++;}else if(s.str[i]>t.str[j]){tag=1;return tag;}else{tag=-1;return tag;}}if(n==m)tag=0;else if((4))tag=1;else if(n<m)tag=-1;(5);}
下列给定程序中函数fun()的功能是:求出字符串中最后一次出现的子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为NULL。例如,当字符串中的内容为abcdabfabcdx,t中的内容为ab时,输出结果应是abcdx。当字符串中的内容为abcdabfabcdx,t中的内容为abd时,则程序输出未找到的信息:Not found!请改正程序中的错误,使它能得出正确的结果。注意;不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:include<stdio.h>include <conio.h>include <string.h>char *fun(char *s,char *t){char *p,*r,*a;/*************found**************/a=Null;while(*s){ p=s;r=t;while(*r)/*************found**************/if(r= =p) {r++;p++;}else break;if(*r=='\0') a=s;s++;}return a;}main(){char s[100],t[100],,*p;clrscr();printf("\nPlease enter string S: ");scanf("%s",s);printf("\nPlease enter substring t: ");scanf("%s",t);p=fun(S,t);if(p) printf("\nThe result is:%s\n",p);else printf("\nNot found!\n ");}
假定输入的字符串中只包含字母和*号。请编写函数 fun(),它的功能是:除了尾部的,:号之外,将字符串中其他*号全部删除。形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言的字符串函数。例如,若字符串中的内容为****A*BC*DEF*G******,删除后,字符串中的内容应当是ABCDEFG******。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:include<conio. h>include<stdio. h>void fun(char *a, char *p){}main ( )char s[81],*t;printf ("Enter a string: \n ");gets (s);t=s;while (*t)t++;t--; /*指针t指向字符串尾部* /while (*t== '*' )t--; /*指针t指向最后一个字母*/fun (s, t);printf ("The string after deleted: \n");puts (s);}
阅读以下说明,回答问题1~4,将解答填入对应的解答栏内。[说明] 假设二叉树采用连接存储结构进行存储,root 指向根接点,p 所指结点为任一给定的结点,编写一个求从根结点到p所指结点之间路径的函数。void path (root, p)btree * root, * p;{Btree *stack[m0], *s;int tag[m0], top =0, i, find =0;s =root;do{while (s ! = NULL){stack [top] = s;tag[top] =0;((1))}if (top >0){((2))if (tag[top] = =1){if((3)){for (i=1; i< =top; i+ + printf ("%d" ,stack[i]- >data);find=1;}else top - -;}if((4)){p=p- >right;((5))}}} while (find || (s! = NULL top ! =0));}
下列给定程序中,函数fun()的功能是:从s所指字符串中,找出t所指字符串的个数作为函数值返回。例如,当s所指字符串中的内容为abcdabfab,t所指字符串的内容为ab,则函数返回整数3。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构.试题程序:include <conio.h>include <stdio.h>include <string.h>int fun (char *s, char *t){int n; char *p, *r;n=0;while(*s){p=s;r=t;while (*r)/**************found**************/if(*r==*p) {r++; p++}else break;/*************found**************/if(r=='\0')n++;s++;}return n;}main(){char s[100], t[100]; int m;clrscr();printf("\nPlease enter string s: ");scanf ("%s",s);printf("\nPlease enter substring t: ");scanf ("%s",t);m=fun (s,t);printf("\nThe result is: m=%d\n", m);}
阅读下列算法说明和算法,将应填入(n)处的语句写在对应栏内。【说明】本程序可以将字符串s1中出现的所有s2子串替换成s3,形成一个新串,但不破坏字符串s1。【代码】include<stdio.h>include<stdlib.h>include<string.h>char*replace(char *s1, char *s2,char *s3){ char *p, *q, *r, *s; int |2,|3, i=0;|2=strlen(s2);|3=strlen(s3);p=s1;while((p=strstr(p,s2))!=NULL){ i++; /* 统计s2串出现的次数*/(1);}i=(2);s=r=(char*)malloc(i); /*分配动态内存存放新字符串*/p=s1;while(1){ q=strstr(p, s2); /* s2串是否在s1中出现,q是首次出现的位置*/if(q!=NULL){ i=q-p;(3);r+=i;(4);r+=|3;p=q+|2; /*将指向s1串的指针移到s2子串出现的位置后,为下一次循环做好准备*/}else /*q为空,表示剩余的s1串中已经没有s2*/{ (5);break; /*终止循环*/}}return(s); /*返回指向所形成的新串的指针*/}void main(){ char *a="sabcababde", *b="ab", *c="efg", *d;d=replace(a, b, c); printf("result=%s\n", d); free(d);}
下列给定的程序中,函数fun()的功能是;将s所指字符串中出现的n所指字符串全部替换成t2所指字符串,所形成的新的字符串放在w所指的数组中。在此处,要求t1和t2所指字符串的长度相同。例如:当s所指字符串中所指的内容为 abcdabfab,t1所指字符串中的内容为ab,t2所指字符串中的内容为99时,结果在w所指的数组中的内容应为99cd99f99。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:include <conio.h>include <stdio.h>include <string.h>/*************found**************/int fun (char *s, char *t1, char *t2, char *w){int i; char *p,*r,*a;strcpy(w,s);while (*w){p=w; r=t1;/*************found**************/while (r)if (*r= =*p) {r++;p++;}else break;if (*r= ='\0'){a=w; r=t2;/*************found**************/while (*r){*a=*r;a++;r++}w+=strlen(t2);}else w++;}}main(){char s[100],t1[100],t2[100],w[100];clrscr();printf("\nPlease enter string S: ");scanf("%s",s);printf("\nPleaseentersubstring t1: ");scanf ("%s", t1);printf("\nPlease enter substring t2: ");scanf ("%s",t2);if (strlen(t1)= =strlen(t2)){fun (s,t1,t2,w);printf("\nThe result is : %s\n",w);}else printf("Error : strlen(t2)\n");}
下面函数的功能是( )。 sss(s,t) char*s,*t; {while(*s); while(*t) *(s++)=*(t++); return s; }A.将字符串s复制到字符串t中B.比较两个字符串的大小C.求字符串的长度D.将字符串t续接到字符串s中
阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。[说明1]函数void fun(char*w,char x,int*n)用来在w数组中插入x,w数组中的数已按由小到大顺序存放,n指存储单元中存放数组中数据的个数,插入后数组中的数仍有序。[C函数1]void fun(char*W,char x,int*n){ int i,P;p=0;w[*n]=x;while(x>w[p]) (1) ;for(i=*n,i>p;i--)w[i]=(2);w[p]=x;++*n;}[说明2]函数void revstr(char*s)将字符串s逆置。例如:字符串“abcde”,经过逆置后变为“edcba”。[C函数2]void revstr(char*s){ char*p,c;if(s==NULL)return;p=(3); /*p指向字符串s的最后一个有效字符*/while(s<p){ /*交换并移动指针*/C=*s;(4)=*p;(5)=c;}}
阅读下列说明和C函数,填补C函数中的空缺,将解答填入答案纸的对应栏目内。 【说明】 字符串是程序中常见的一种处理对象,在字符串中进行子串的定位、插入和删除是常见的运算。 设存储字符串时不设置结束标志,而是另行说明串的长度,因此串类型定义如下: typedef struct ﹛ Char *str; //字符串存储空间的起始地址 int length; //字符串长 int capacity; //存储空间的容量 ﹜SString;【函数1说明】 函数indexStr(S,T,pos)的功能是:在S 所表示的字符串中,从下标pos开始查找T所表示字符串首次出现的位置。方法是:第一趟从S中下标为pos、T中下标伟0的字符开始,从左往右逐个对于来比较S和T的字符,直到遇到不同的字符或者到达T的末尾。若到达T的末尾,则本趟匹配的起始下标pos为T出现的位置,结束查找;若遇到了不同的字符,则本趟匹配失效。下一趟从S中下标pos+1处的字符开始,重复以上过程。若在S中找到T,则返回其首次出现的位置,否则返回-1。 例如,若S中的字符为伟students ents,T中的字符串伟ent,pos=0,则T在S中首次出现的位置为4。 【C函数1】 int index Str(SString S ,SString T,int pos) ﹛ int i,j: i (S.length1||T.length1||pos+T.length-1) return-1; for(i=pos,j=0;iS.length jT.length;)﹛ if (S.str[i]==T.str[j])﹛ i++;j++; ﹜ else﹛ i=( 1 );j=0 ﹜ ﹜ if ( 2 )return i -T.length; return-1; ﹜ 【函数2说明】 函数 eraseStr(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-length1||T.length1||S-lengthT.length) return; Pos=0; for(;;)﹛ //调用indexStr在S所表示串的pos开始查找T的位置 Pos=indexStr( 3 ); if(pos=-1) //S所表示串中不存在子串T return; for(i=pos+T.length;iS-length;i++) //通过覆盖来删除自串T S-str[( 4 )]=S-str[i]; S-length=( 5 ); //更新S所表示串的长度 ﹜ ﹜
己知字符串 s=(X+Y)*Z ,其中,单引号不是字符串的内容, 经过以下运算后,t3 的值是( )。 t1=SubString(s ,3,1) t2=Concat(XY ,t1) t3=Replace(s,SubString(s,1,5),t2) 注: SubString(s,k,n)表示从串 s的第 k 个字符开始取出长度为 n 的子串, Concat(s,t)表示将串 t 连接在 s 之后, Replace(s,t,r)表示用 r 替换串 s 中的子串 t。A.;XY Z* B. (X Z)*Y C. XYZ * D. XY *Z
阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】模式匹配是指给定主串t和子串s,在主串t中寻找子串s的过程,其中s称为模式。如果匹配成功,返回s在t中的位置,否则返回-1。KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下:1.在串t和串s中,分别设比较的起始下标i=j=0。2.如果串t和串s都还有字符,则循环执行下列操作:(1)如果j=-l或者t[i]=s[j],则将i和j分别加1,继续比较t和s的下一个字符;(2)否则,将j向右滑动到next[j]的位置,即j =next[j]。3.如果s中所有字符均已比较完毕,则返回匹配的起始位置(从1开始);否则返回-1。其中,next数组根据子串s求解。求解next数组的代码已由get_next函数给出。【C代码】(1)常量和变量说明t,s:长度为lt和ls的字符串next:next数组,长度为ls(2)C程序#include #include#include/*求next[]的值*/void get_next( int*next, char *s, int ls) { inti=0,j=-1; next[0]=-1;/*初始化next[0]*/ while(i= ls)return (4) ;else return-1;}【问题1】(8分)根据题干说明,填充C代码中的空(1)~(4).【问题2】(2分)根据题干说明和C代码,分析出kmp算法的时间复杂度为(5)(主串和子串的长度分别为It和Is,用O符号表示)。【问题3】(5分)根据C代码,字符串"BBABBCAC"的next数组元素值为(6)(直接写素值,之间用逗号隔开)。若主串为"AABBCBBABBCACCD",子串为"BBABBCAC",则函数Kmp的返回值是(7)。
阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内。阅读以下说明和C函数,将应填入 (n) 处的语句或语句成分写在答题纸的对应栏内。【说明1】函数deldigit(char *s) 的功能是将字符串s中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与s等长的临时字符串空间并令t指向它,将非数字字符按次序暂存入该空间,最后再拷贝给s。【C函数】char *t = (char *)malloc( (1) ); /*申请串空间*/ int i, k = 0; if (!t) return; for(i = 0; i =’0’ if ( (4) ) { ch = *s; *s = *(s+len-1); *(s+len-1) = ch; reverse( (5) ); }}
阅读下列说明和C代码,回答问题,将解答填入答题纸的对应栏内。【说明1】函数deldigit(char *s) 的功能是将字符串s中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与s等长的临时字符串空间并令t指向它,将非数字字符按次序暂存入该空间,最后再拷贝给s。【C函数】void deldigit(char *s){ char *t = (char *)malloc( (1) ); /*申请串空间*/ int i, k = 0; if (!t) return; for(i = 0; i if ( !(*(s+i)>=’0’ } (3) = ’\0’; /*设置串结束标志*/ strcpy(s,t);free(t);}【说明2】函数reverse(char *s, int len)的功能是用递归方式逆置长度为len的字符串s。例如,若串s的内容为“abcd”,则逆置后其内容变为“dcba”。【C函数】void reverse(char *s, int len){ char ch; if ( (4) ) { ch = *s; *s = *(s+len-1); *(s+len-1) = ch; reverse( (5) ); }}
已知字符串s='(X+Y)+Z',其中,单引号不是字符串的内容,经过以下运算后,t3的值是( )。t1=SubString(s,3,1)t2=Concat('XY',t 1)t3=Replace(s,SubString(s,1,5),t2)注:SubString(s,k,n)表示从串s的第k个字符开始取出长度为n的子串,Concat(s,t)表示将串t连接在s之后,Replace(s,t,r)表示用r替换串s中的子串t。A.'XY+Z*'B.'(X+Z)*Y'C.'XYZ+*'D.'XY+*Z'
阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】 模式匹配是指给定主串t和子串s,在主串t中寻找子串s的过程,其中s称为模式。如果匹配成功,返回s在t中的位置,否则返回-1 。 KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下: 1.在串t和串s中,分别设比较的起始下标i=j=0。 2.如果串t和串s都还有字符,则循环执行下列操作: (1)如果j=-l或者t[i]=s[j],则将i和j分别加1,继续比较t和s的下一个字符; (2)否则,将j向右滑动到next[j]的位置,即j =next[j]。 3.如果s中所有字符均已比较完毕,则返回匹配的起始位置(从1开始);否则返回-1. 其中,next数组根据子串s求解。求解next数组的代码已由get_next函数给出。【C代码】(1)常量和变量说明 t,s:长度为悯铂Is的字符串 next:next数组,长度为Is(2)C程序#include #include #include /*求next[]的值*/void get_next( int *next, char *s, int Is) { int i=0,j=-1; next[0]=-1;/*初始化next[0]*/ while(i if(j==-1lls[i]==s[j]){/*匹配*/ j++; i++; if( s[i]==s[j]) next[i]= next[j]; else Next[i]= j; }else j = next[j]; }} int kmp( int *next, char *t ,char *s, intlt, int Is ) { Int i=0,j =0 ; while(i if(j==-1 || (2) ){ i++ ; j++ ; }else (3) ;}if (j >= ls)return (4) ;else return -1;} 【问题1】(8分) 根据题干说明,填充C代码中的空(1)~(4).【问题2】(2分)根据题干说明和C代码,分析出kmp算法的时间复杂度为(5)(主串和子串的长度分别为It和Is,用O符号表示)。【问题3】(5分)根据C代码,字符串“BBABBCAC”的next数组元素值为(6)(直接写素值,之间用逗号隔开)。若主串为“AABBCBBABBCACCD”,子串为“BBABBCAC”,则函数Kmp的返回值是(7)。
函数AAA(s,t) char*s,*t; {while(*t++); t--; while(*t++=*s++); } 的功能是:()。A、求串的长度B、比较两个串的大小C、将串s复制到串t中D、将串s连接到串t中
问答题下列给定程序中,函数fun的功能是:从s所指字符串中,找出t所指字符串的个数作为函数值返回。例如,当s所指字符串中的内容为“abcdabfab”,t所指字符串的内容为“ab”,则函数返回整数3。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!/**********code.c**********/#include #include #include #include int fun(char *s, char *t){ int n; char *p, *r; n=0; while(*s) { p=s; r=t; while(*r) /**********found**********/ if(*r==*p){r++; p++} else break; /**********found**********/ if(r=='\0') n++; s++; } return n;}void main(){ char s[100],t[100]; int m; system(CLS); printf(Please enter strings:); scanf(%s,s); printf(Please enter substrings:); scanf(%s,t); m=fun(s,t); printf(The result is:m=%d, m);}/**********-code.c**********/
单选题有以下函数:int fun(char *s,char *t){ while((*s)(*t)(*t++==*s++)); return (*s-*t);}函数的功能是( )。A求字符串的长度B比较两个字符串的大小C将字符串s复制到字符串t中D连接字符串s和字符串t
单选题函数AAA(s,t) char*s,*t; {while(*t++); t--; while(*t++=*s++); } 的功能是:()。A求串的长度B比较两个串的大小C将串s复制到串t中D将串s连接到串t中