已知链式存储的源串S和目标串T,其每个结点大小为1,试写出一个算法,在源串S中查找目标串T,如没有找到则打印出错信息;否则,在第一次匹配后请将源串S的匹配部分就地逆置。(16分) 注:链串定义如下: typedef char elementype; typedef struct node { elementype data; struct node * next; } linkstr;
已知链式存储的源串S和目标串T,其每个结点大小为1,试写出一个算法,在源串S中查找目标串T,如没有找到则打印出错信息;否则,在第一次匹配后请将源串S的匹配部分就地逆置。(16分) 注:链串定义如下: typedef char elementype; typedef struct node { elementype data; struct node * next; } linkstr;
参考答案和解析
单链表多重链表动态链表静态链表
相关考题:
试题四(共 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*/}}
以下程序的功能是:建立一个带布头结点的单向链表,并将存储在数组中的字符依次存储到链表的各个结点中,请从与下划线处号码对应的一组选项中选择出正确的选项#include <stdlib.h>struct node{char data; struct node *next;};(48) CreatList(char*s),{struct node *h,*p,*q;h=(struct node*)malloc(sizeof(struct node));p=q=h;while(*s!="\0"){ p=(struct node*)malloc(sizeof(struct node));p->data= (49) ;q->next=p;q= (50) ;s++;}p->next="\0";return h;}main(){ char str[]="link list";struct node*head;head=CreatList(str);…}(1)A.char*B.struct nodeC.struct node*D.char
下面函数的功能是()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)处的字句写在对应栏内。[说明]本程序实现对指定文件内的单词进行计数。其中使用二叉树结构来保存已经读入的不同单词,并对相同单词出现的次数进行计数。此二叉树的左孩子结点的字符串值小于父结点的字符串值,右孩子结点的字符串值大于父结点的字符串值。函数getword(char*filename,char*word)是从指定的文件中得到单词。char*strdup(char*S)是复制S所指向的字符串,并返回复制字符串的地址。[C程序]include <stdio.h>include <ctype.h>include <string.h>define MAXWORD 100struct node {char*word;int count;struct node*left;struct node*right;}struct node*addtree(struct node*P,char*w){ int cond;if(p==NULL){ /*向树中插入结点*/P=(struct node*)malloc(sizeof(struct node));P->word=strdup(w);P->count=1;(1) ;}elseif((oond=strcmp(w,p->word))==0) (2) ;else if(cond<0)p->left=(3);else p->right=(4);return p;}main(){ Struct node*root;char word[MAXWORD];root=NULL;filename="example.dat";while(getword(filename,word)!=EOF))root=(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:}
以下程序中函数fun的功能是:构成一个如图所示的带头结点的单词链表,在结点的数据域中放入了具有两个字符的字符串。函数disp的功能是显示输出该单链表中所有结点中的字符串。请填空完成函数disp。[*]include<stdio.h>typedef struct node /*链表结点结构*/{char sub[3];struct node *next;}Node;Node fun(char s) /*建立链表*/{ … }void disp(Node *h){ Node *
以下程序的功能是:建立一个带有头结点的甲—向链表,并将存储在数组中的字符依次转存到链表的各个结点中,请从与下划线处号码对应的一组选项中选择出正确的选项。#include <stdlib.h>struct node{ char data; struct node *next: };(1) CreatList(char *s){struct node *h,*p,*q;h = (struct node *)malloc sizeof(struct node));p=q=h;while(*s! ='\0'){p = (struct node *)malloc(sizeof (struct node));p->data = (2) ;q->next = p;q - (3) ;S++;}p->next='\0';return h;}main(){char str[]="link list";struct node *head;head = CreatList(str);}(1)A.char*B.struct nodeC.struct node*D.char
下面函数的功能是( )。 sss(s,t) char*s,*t; {while(*s); while(*t) *(s++)=*(t++); return s; }A.将字符串s复制到字符串t中B.比较两个字符串的大小C.求字符串的长度D.将字符串t续接到字符串s中
链表题:一个链表的结点结构struct Node{int data ;Node *next ;};typedef struct Node Node ;(1)已知链表的头结点head,写一个函数把这个链表逆序( Intel)
下列函数的功能是set(s,t){ char *s,*t; while((*s)(*t)(*t++==*s++)); return(*s-*t);}A.求字符串的长度B.比较两字符串的大小C.将字符串s复制到字符串t中D.将字符串s连接到字符串t后
以下程序中函数fun的功能是:构成—个如图所示的带头结点的单向链表,在结点的数据域中放入了具有两个字符的字符串。函数disp的功能是显示输出该单向链表中所有结点中的字符串。请填空完成函数disp。include<stdio.h>typedef struct node /*链表结点结构*/{ char sub[3];struct node *next;}Node;Node fun(char s) /* 建立链表*/{ ...... }void disp(Node *h){ Node *p;p=h->next;while([ ]){printf("%s\n",p->sub);p=[ ];}}main(){ Node *hd;hd=fun(); disp(hd);printf("\n");}
阅读下列说明和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所表示串的长度 ﹜ ﹜
试题四(共15分)阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】模式匹配是指给定主串t和子串s,在主串t中寻找子串s的过程,其中s称为模式。如果匹配成功,返回s在t中的位置,否则返回-1 。KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下:1.在串t和串s中,分别设比较的起始下标i=J=O2.如果串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 stdio.hnclude stdliB.hinclude string.h/*求next【】的值*/void get_next( int *next, char *s, int Is) {int i=0,j=-1;next[0]=-1;/*初始化next[0]*/while(i ils){/*还有字符*/if(j=-1l ls[i]=s[j]){/*匹配*/j++;i++;if( s[i]一s[jl)next [i]- next[j];elseNext[i]=j;}elseJ= next[j];}}int kmp( int *next, char *t ,char *s, int.lt, int Is ){inti= 0,j =0 ;while (ilt ( 1 ) {if( j=-1 II 2_) {i++ ;j ++ ;} else(3) :}if (j= ls)Retum (4)else .retum-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代码,回答问题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)。
在字符串的KMP模式匹配算法中,需先求解模式串的next函数值,其定义如下式所示,j表示模式串中字符的序号(从1开始)。若模式串p为"abaac",则其next函数值为 ( ) 。A.01234B.01122C.01211D.01111
阅读下列说明和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) ); }}
【试题三】阅读下列说明和 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 indexStr(SString S ,SString T,int pos)﹛int i,j:if(S.lengthleghtlengthlength;i++) //通过覆盖来删除自串 TS->str[()]=S->str[i];S->length=(); //更新 S所表示串的长度﹜﹜
阅读下列说明和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中
单选题有以下函数:int fun(char *s,char *t){ while((*s)(*t)(*t++==*s++)); return (*s-*t);}函数的功能是( )。A求字符串的长度B比较两个字符串的大小C将字符串s复制到字符串t中D连接字符串s和字符串t
填空题设线性链表的存储结构如下: struct node {ELEMTP data; /*数据域*/ struct node *next; /*指针域*/ } 试完成下列在链表中值为x的结点前插入一个值为y的新结点。如果x值不存在,则把新结点插在表尾的算法。 void inserty(struct node *head,ELEMTP x,ELEMTP y) {s=(struct node *)malloc(sizeof(struct node)); (); if(){s-nexr=head;head=s;} else { q=head;p=q-next; while(p-dqta!=xp-next!=NULL){q=p;()} if(p-data= = x){q-next=s;s-next=p;} else{p-next=s;s-next=NULL;} } }
单选题函数AAA(s,t) char*s,*t; {while(*t++); t--; while(*t++=*s++); } 的功能是:()。A求串的长度B比较两个串的大小C将串s复制到串t中D将串s连接到串t中