数据结构与算法习题及答案

精心整理

}

voidList::PrintList(){

}

intList::Max(ListNode*f){

}

intList::Num(ListNode*f){

}

floatList::Avg(ListNode*f,int&n){

if(f->link==NULL) //递归算法:求链表中所有元素的平均值 //链表中只有一个结点,递归结束条件 if(f==NULL)return0; return1+Num(f->link); //递归算法:求链表中结点个数 //空表,返回0 //否则,返回后继链表结点个数加1 //递归算法:求链表中的最大值 //递归结束条件 //在当前结点的后继链表中求最大值 //如果当前结点的值还要大,返回当前检点值 //否则返回后继链表中的最大值 ListNode*p=first; while(p!=NULL){ cout<<‘\\n’;

cout<data<<'';p=p->link;

}

//输出链表

cout<<\; }

current->link=NULL;

//链尾封闭

cin>>value;

//再输入

if(f->link==NULL)returnf->data; inttemp=Max(f->link); if(f->data>temp)returnf->data; elsereturntemp; {n=1;return(float)(f->data);}

else{floatSum=Avg(f->link,n)*n;n++;return(f->data+Sum)/n;} } #include\

Listtest;intfinished;

cout<<“输入建表结束标志数据:”; cin>>finished;

test.PrintList();

//输入建表结束标志数据 //打印链表

test.NewList(finished);

//建立链表

//定义在主文件中 intmain(intargc,char*argv[]){ cout<<\test.GetMax(); cout<<\test.GetNum(); cout<<\test.GetAve()<<'\\n'; printf(\return0;

精心整理

精心整理

}

第4章串、数组和广义表

习题

1.选择题

(1)串是一种特殊的线性表,其特殊性体现在()。 A.可以顺序存储B.数据元素是一个字符

C.可以链式存储D.数据元素可以是多个字符若 (2)串下面关于串的的叙述中,()是不正确的? A.串是字符的有限序列B.空串是由空格构成的串 C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储 (3)串“ababaaababaa”的next数组为()。 A...0456D. (4)串“ababaabab”的nextval为()。 A.B. C..010101011 (5)串的长度是指()。 A.串中所含不同字母的个数B.串中所含字符的个数 C.串中所含不同字符的个数D.串中所含非空格字符的个数 (6)假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=()。 A.808B.818 C.1010D.1020 (7)设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为()。 A.BA+141B.BA+180 C.BA+222D.BA+225 (8)设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为()。 A.13B.33 C.18D.40 (9)若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(i

A.i(i-1)/2+jB.j(j-1)/2+iC.i(j-i)/2+1D.j(i-1)/2+1

(11)设二维数组A[1..m,1..n](即m行n列)按行存储在数组B[1..m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为()。

A.(i-1)*n+jB.(i-1)*n+j-1 C.i*(j-1)D.j*m+i-1 (12)数组A[0..4,-1..-3,5..7]中含有元素的个数()。 A.55B.45 C.36D.16

(13)广义表A=(a,b,(c,d),(e,(f,g))),则Head(Tail(Head(Tail(Tail(A)))))的值为()。 A.(g)B.(d)C.cD.d

(14)广义表((a,b,c,d))的表头是(),表尾是()。 A.aB.()C.(a,b,c,d)D.(b,c,d) 精心整理

精心整理

(15)设广义表L=((a,b,c)),则L的长度和深度分别为()。 A.1和1B.1和3 C.1和2D.2和3

(1)已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。 模式串t的next和nextval值如下: j t串 next[j] nextval[j] 123456789101112 abcaabbabcab 011122312345 011021301105 (2)设目标为t=“abcaabbabcabaacbacba”,模式为p=“abcabaa” ①计算模式p的naxtval函数值;

②不写出算法,只画出利用KMP算法进行模式匹配时每一趟的匹配过程。 ①p的nextval函数值为0110132。(p的next函数值为0111232)。 ②利用KMP(改进的nextval)算法,每趟匹配过程如下: 第一趟匹配:abcaabbabcabaacbacba abcab(i=5,j=5) 第二趟匹配:abcaabbabcabaacbacba abc(i=7,j=3) 第三趟匹配:abcaabbabcabaacbacba a(i=7,j=1) 第四趟匹配:abcaabbabcabaacbacba (成功)abcabaa(i=15,j=8) (3)数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。求: ①存放该数组所需多少单元? ②存放数组第4列所有元素至少需多少单元? ③数组按行存放时,元素A[7,4]的起始地址是多少? ④数组按列存放时,元素A[4,7]的起始地址是多少? 每个元素32个二进制位,主存字长16位,故每个元素占2个字长,行下标可平移至1到11。 (1)242(2)22(3)s+182(4)s+142 (4)请将香蕉banana用工具H()—Head(),T()—Tail()从L中取出。 L=(apple,(orange,(strawberry,(banana)),peach),pear) H(H(T(H(T(H(T(L))))))) (5)写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。 voidCount() //统计输入字符串中数字字符和字母字符的个数。 {inti,num[36]; charch;

for(i=0;i<36;i++)num[i]=0;//初始化 while((ch=getchar())!=‘#’)//‘#’表示输入字符串结束。 if(‘0’<=ch<=‘9’){i=ch-48;num[i]++;}//数字字符 else if(‘A’<=ch<=‘Z’){i=ch-65+10;num[i]++;}//字母字符 for(i=0;i<10;i++)//输出数字字符的个数 printf(“数字%d的个数=%d\\n”,i,num[i]); for(i=10;i<36;i++)//求出字母字符的个数 printf(“字母字符%c的个数=%d\\n”,i+55,num[i]); 精心整理

精心整理

}//算法结束。

(6)写一个递归算法来实现字符串逆序存储,要求不另设串存储空间。

[题目分析]实现字符串的逆置并不难,但本题“要求不另设串存储空间”来实现字符串逆序存储,即第一个输入的字符最后存储,最后输入的字符先存储,使用递归可容易做到。

voidInvertStore(charA[]) //字符串逆序存储的递归算法。

{charch;

staticinti=0;//需要使用静态变量 scanf(\

if(ch!='.')//规定'.'是字符串输入结束标志 {InvertStore(A);

A[i++]=ch;//字符串逆序存储 } A[i]='\\0';//字符串结尾标记 }//结束算法InvertStore。 (7)编写算法,实现下面函数的功能。函数voidinsert(char*s,char*t,intpos)将字符串t插入到字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。(说明:不得使用任何库函数)

[题目分析]本题是字符串的插入问题,要求在字符串s的pos位置,插入字符串t。首先应查找字符串s的pos位置,将第pos个字符到字符串s尾的子串向后移动字符串t的长度,然后将字符串t复制到字符串s的第pos位置后。 对插入位置pos要验证其合法性,小于1或大于串s的长度均为非法,因题目假设给字符串s的空间足够大,故对插入不必判溢出。 voidinsert(char*s,char*t,intpos) //将字符串t插入字符串s的第pos个位置。 {inti=1,x=0;char*p=s,*q=t;//p,q分别为字符串s和t的工作指针 if(pos<1){printf(“pos参数位置非法\\n”);exit(0);} while(*p!=’\\0’&&i=pos;j--){*(p+x)=*p;p--;}//串s的pos后的子串右移,空出串t的位置。 q--;//指针q回退到串t的最后一个字符 for(j=1;j<=x;j++)*p--=*q--;//将t串插入到s的pos位置上 [算法讨论]串s的结束标记('\\0')也后移了,而串t的结尾标记不应插入到s中。 (8)已知字符串S1中存放一段英文,写出算法format(s1,s2,s3,n),将其按给定的长度n格式化成两端对齐的字符串S2,其多余的字符送S3。

[题目分析]本题要求字符串s1拆分成字符串s2和字符串s3,要求字符串s2“按给定长度n格式化成两端对齐的字符串”,即长度为n且首尾字符不得为空格字符。算法从左到右扫描字符串s1,找到第一个非空格字符,计数到n,第n个拷入字符串s2的字符不得为空格,然后将余下字符复制到字符串s3中。 voidformat(char*s1,*s2,*s3)

//将字符串s1拆分成字符串s2和字符串s3,要求字符串s2是长n且两端对齐 {char*p=s1,*q=s2; inti=0;

while(*p!='\\0'&&*p=='')p++;//滤掉s1左端空格 精心整理

联系客服:779662525#qq.com(#替换为@)