数据结构答案 第5章 串学习指导
数据结构第五章 查找 答案

数据结构与算法上机作业第五章查找一、选择题1、若构造一棵具有n个结点的二叉排序树,在最坏情况下,其高度不超过 B 。
A. n/2B. nC. (n+1)/2D. n+12、分别以下列序列构造二叉排序数(二叉查找树),与用其他3个序列所构造的结果不同的是 C :A. (100, 80, 90, 60, 120, 110, 130)B. (100, 120, 110, 130, 80, 60, 90)C. (100, 60, 80, 90, 120, 110, 130)D. (100, 80, 60, 90, 120, 130, 110)3、不可能生成下图所示的二叉排序树的关键字的序列是 A 。
A. 4 5 3 1 2B. 4 2 5 3 1C. 4 5 2 1 3D. 4 2 3 1 54、在二叉平衡树中插入一个结点造成了不平衡,设最低的不平衡点为A,并已知A的左孩子的平衡因子为0,右孩子的平衡因子为1,则应作 C 型调整使其平衡。
A. LLB. LRC. RLD. RR5、一棵高度为k的二叉平衡树,其每个非叶结点的平衡因子均为0,则该树共有 C 个结点。
A. 2k-1-1B. 2k-1+1C. 2k-1D. 2k+16、具有5层结点的平衡二叉树至少有 A 个结点。
A. 12B. 11C. 10D. 97、下面关于B-和B+树的叙述中,不正确的是 C 。
A. B-树和B+树都是平衡的多叉树B. B-树和B+树都可用于文件的索引结构C. B-树和B+树都能有效地支持顺序检索D. B-树和B+树都能有效地支持随机检索8、下列关于m阶B-树的说法错误的是 D 。
A. 根结点至多有m棵子树B. 所有叶子结点都在同一层次C. 非叶结点至少有m/2(m为偶数)或m/2+1(m为奇数)棵子树D. 根结点中的数据是有序的9、下面关于哈希查找的说法正确的是 C 。
A. 哈希函数构造得越复杂越好,因为这样随机性好,冲突小B. 除留余数法是所有哈希函数中最好的C. 不存在特别好与坏的哈希函数,要视情况而定D. 若需在哈希表中删去一个元素,不管用何种方法解决冲突都只要简单地将该元素删去即可10、与其他查找方法相比,散列查找法的特点是 C 。
第四、五章串、数组和广义表练习题答案

第四、五章串、数组和广义表练习题答案一.填空题1. 不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。
2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为3。
3. 子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。
4. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,则第 6 次匹配成功。
5. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为(n-m+1)*m。
6. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。
已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为288 B ;末尾元素A57的第一个字节地址为1282 ;若按行存储时,元素A14的第一个字节地址为(8+4)×6+1000=1072 ;若按列存储时,元素A47的第一个字节地址为(6×7+4)×6+1000)=1276 。
(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)7. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为8950 。
答:不考虑0行0列,利用列优先公式:LOC(a ij)=LOC(a c1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L 得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=89508. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。
9.求下列广义表操作的结果:(1)GetHead【((a,b),(c,d))】=== (a, b) ; //头元素不必加括号(2)GetHead【GetTail【((a,b),(c,d))】】=== (c,d) ;(3)GetHead【GetTail【GetHead【((a,b),(c,d))】】】=== b ;(4)GetTail【GetHead【GetTail【((a,b),(c,d))】】】=== (d);10.C语言规定,字符串常量按_字符数组_____处理,它的值在程序的执行过程中是不能改变的。
数据结构第四、五、六、七章作业答案

数据结构第四、五、六、七章作业答案第四、五章一、填空题1. 不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。
2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的位置为 3 。
3. 子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。
4、串的存储方式有顺序存储、堆分配存储和块链存储5、有一个二维数组A[0:8,1:5],每个数组元素用相邻的4个字节存储,存储器按字节编址,假设存储数组元素A[0,1]的地址是100,若按行主顺序存储,则A[3,5]的地址是176 和 A[5,3]的地址是208 。
若按列存储,则A[7,1] 的地址是128 ,A[2,4]的地址是216 。
6、设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 8950 。
7、三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。
8、二维数组A[10][20]采用列序为主方式存储,每个元素占10个存储单元,且A[0][0]的存储地址是2000,则A[6][12]的地址是32609、已知二维数组A[20][10]采用行序为主方式存储,每个元素占2个存储单元,并且A[10][5]的存储地址是1000,则A[18][9]的存储地址是 116810、已知二维数组A[10][20]采用行序为主方式存储,每个元素占2个存储单元,并且A[0][0]的存储地址是1024, 则A[6][18]的地址是130011、两个串相等的充分必要条件是长度相等、对应位置的字符相同。
12、二维数组A[10][20]采用列序为主方式存储,每个元素占一个存储单元,并且A[0][0]的存储地址是200,则A[6][12]的地址是200+(12*10+6)= 326 。
第5章-串

子串,s旳串值变化。
5-2 串旳表达和实现
一.串旳顺序存储
1.存储方式:同一般旳线性表旳顺序存储构 造完全相同.用一组地址连续旳存储单元存 储字符序列, 据预定义大小,为每个定义旳串 变量分配一种固定长度旳存储区。
2.索引存储旳例子 设字符串:A=”Red” B=”Yellow” C=”Blue” D=”White” 用指针free指向堆中未使用空间旳首地址。
索引表: Name A B C D ……
Length 3 6 4 5 ……
Stradr 0 3 9
……
free 堆:
R e d Y e l l o w B l u E Wh i t e …
为 len 旳子串。而且赋予给s2,len=0得到旳是空串。 【例5-7】 SubStr ("abcdefghi",3,4) = "cdef”
4. 串比较: Strcmp (s1,s2) 操作条件:串s1,s2存在。 操作成果:若s1= =s2,返回值为0;若s1<s2, 返
回值<0;若s1>s2, 返回值>0。
(2)使用gets() 函数
格式为:gets(字符数组名); 【例5-3】 char str[10]; printf("Input your str: "); gets(str);
•使用gets ()方式输入时,字符串中允许具有空
格。
2.字符串旳输出
字符串旳输出也有两种措施:
(1)使用printf () 函数 使用printf () 函数时,输出格式中要设置"%s",再
止符,以此表达串旳结尾。例如C语言中处理定长串旳措施
数据结构第4-5章作业及答案

数据结构第4-5章作业及答案⼀、填空题1. 不包含任何字符(长度为0)的串称为空串;由⼀个或多个空格(仅由空格符)组成的串称为空⽩串。
2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的位置为3。
3. ⼦串的定位运算称为串的模式匹配;被匹配的主串称为⽬标串,⼦串称为模式。
4、若n为主串长,m为⼦串长,则串的古典(朴素)匹配算法最坏的情况下需要⽐较字符的总次数为(n-m+1)*m。
5、假设有⼆维数组A6×8,每个元素⽤相邻的6个字节存储,存储器按字节编址。
已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为288 B ;末尾元素A57的第⼀个字节地址为1282 ;若按⾏存储时,元素A14的第⼀个字节地址为(8+4)×6+1000=1072 ;若按列存储时,元素A47的第⼀个字节地址为(6×7+4)×6+1000)=1276 。
(注:数组是从0⾏0列还是从1⾏1列计算起呢?由末单元为A57可知,是从0⾏0列开始!)6、设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为8950 。
答:不考虑0⾏0列,利⽤列优先公式:LOC(a ij)=LOC(a c1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L 得:LOC(a32,58)=2048+[(58-1)* (60-1+1)+32-1]]*2=89507、三元素组表中的每个结点对应于稀疏矩阵的⼀个⾮零元素,它包含有三个数据项,分别表⽰该元素的⾏下标、列下标和元素值。
8、⼆维数组A[10][20]采⽤列序为主⽅式存储,每个元素占10个存储单元,且A[0][0]的存储地址是2000,则A[6][12]的地址是32609、已知⼆维数组A[20][10]采⽤⾏序为主⽅式存储,每个元素占2个存储单元,并且A[10][5]的存储地址是1000,则A[18][9]的存储地址是 116810、⼴义表((a,b),c,d)的表头是(a,b) ,表尾是 (c,d)11、⼴义表((((a),b),c),d)的表头是(((a),b),c) ,表尾是(d)12、已知⼆维数组A[10][20]采⽤⾏序为主⽅式存储,每个元素占2个存储单元,并且A[0][0]的存储地址是1024, 则A[6][18]的地址是130013、若串的长度不能确定,可采⽤动态存储结构,为串值分配⼀个存储空间,同时建⽴⼀个串的描述⼦以指⽰串值的长度和串在存储空间中的位置,称该结构为堆/堆结构14、稀疏矩阵⼀般的压缩存储⽅法有两种,即三元组表和⼗字链表。
数据结构习题5答案

数据结构习题5答案数据结构习题5答案在学习数据结构的过程中,习题是我们巩固知识的重要途径。
习题不仅能够帮助我们理解和掌握数据结构的概念和原理,还能够提升我们的解决问题的能力。
本文将对数据结构习题5进行详细解答,帮助读者更好地理解和运用相关知识。
习题1:给定一个链表的头节点,判断链表是否有环。
解答:判断链表是否有环,可以使用快慢指针的方法。
定义两个指针,一个指针每次移动一个节点,另一个指针每次移动两个节点。
如果链表有环,那么两个指针必定会相遇;如果链表没有环,那么快指针会先到达链表的末尾。
具体实现如下:```pythondef has_cycle(head):if not head or not head.next:return Falseslow = headfast = head.nextwhile slow != fast:if not fast or not fast.next:return Falseslow = slow.nextfast = fast.next.nextreturn True```习题2:给定一个链表的头节点和一个目标值,在链表中删除所有等于目标值的节点。
解答:删除链表中等于目标值的节点,需要遍历链表,找到目标值并删除。
由于链表的删除操作需要修改指针指向,因此需要维护一个指向当前节点的前一个节点的指针。
具体实现如下:```pythondef remove_elements(head, val):dummy = ListNode(0)dummy.next = headprev = dummycurr = headwhile curr:if curr.val == val:prev.next = curr.nextelse:prev = currcurr = curr.nextreturn dummy.next```习题3:给定一个链表的头节点和一个目标值,在链表中删除所有小于目标值的节点。
《数据结构(C语言描述)》 第5章串

的子串,s的串值改变。 (9)串替换 strrep(s,t,r) ; 操作条件:串s,t,r存在,t不为空。 操作结果:用串r 替换串s中出现的所有与串t相等的子 串,s的串值改变。
例如操作前:s1="he",s2=" bei", 则操作结果是s1="he bei"
(4)串比较 strcmp(s1,s2); 操作结果:若s1==s2,返回值为0;若s1<s2, 返回值<0;若 s1>s2, 返回值>0。
result= strcmp("abc","Abc");/* result>O */
result= strcmp ("exam1.c","exam1.c");/* result=O */
result= strcmp ("Joe',"Joseph");/* result<O */
第6页
2020年1月12日星期日
(5)求子串substr (s1,s2,m,n) ;操作结果:返回从串s1 的第m个字符开始的长度为n的子串,并赋值给s2。当 n=0时得到的是空串。
第12页
2020年1月12日星期日
依 次 将 目 标 串 中 的 子 串 T[i‥i+m-1] 和 模 式 串 P[0..m-1] 进 行 比 较 , 若 T[i..i+m-1]=P[0..m-1]( 即 titi+1‥ti+m-1"="p0p1…pm-1"), 则 称 从 位 置 i开 始 的 匹 配成功;若T[i..i+m-1]≠P[0..m-1],则称从位置i开始 的匹配失败。上述的位置i又称为位移,当T[i..i+m1]=P[0..m-1] 时 , i 称 为 有 效 位 移 ; 当 T[i..i+m1]≠P[0..m-1]时,i称为无效位移。
《数据结构》课件第5章

串的链式存储结构对某些串操作,如联接操作等有 一定方便之处,但总的来说,不如顺序存储结构灵活, 它占用存储量大而且操作较复杂。
图5.3是每个结点存放一个字符的串的单链表示意图, 图5.4是每个结点存放4个字符的串的单链表示意图。一个 结点存储多个字符的链式结构也称为块链结构。
图5.3 串的链式存储结构中每个结点存放1个字符
串T1的长度等于MAXSIZE,则两串联接得到的S串 实际上只是串T1的拷贝,串T2全部被截断,S串的长度 等于MAXSIZE。用C语言实现的具体算法如下: SeqString concat(SeqString t1,SeqString t2) /*由串t1和串t2联接而成的新串存放在串s中,以返回值 形式带回。若长度超过规定的长度,则截断*/ {
5.1 串的定义及基本操作
串(String)是由零个或多个字符组成的有限序列。一 般记为
S = "a1 a2 …an" (n≥0) 其中,S是串名,用单引号或双引号括起来的字符序 列是串的值,ai(1≤i≤n)可以是字母、数字或其它字符。串 中字符的数目n称为串的长度,长度为0的串称为空串。 串中任意个连续的字符组成的子序列称为该串的子串, 包含子串的串相应地称为主串。通常把字符在序列中的 序号称为该字符在串中的位置,子串在主串中的位置则 以子串的第一个字符在主串中的位置来表示。空串是任 意串的子串,任意串是其自身的子串。
(2) 非紧凑格式,即每个存储单元仅存放一个字符。 这种存储方式的空间利用率很低,但操作时不需要分离字 符,因而程序处理字符的速度比较快。如图5.2所示,存放 给定的串C="datastructure"则需要15个存储单元。
图5.1 串值的紧凑格式存储
图5.2 串值的非紧凑格式存储
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章串5.1 知识点分析1.串的定义串(String)是由零个或多个任意字符组成的有限序列。
一般记作:s="a1 a2 …a i…a n"。
其中s 是串名,用双引号括起来的字符序列为串值,但引号本身并不属于串的内容。
a i(1<=i<=n)是一个任意字符,它称为串的元素,是构成串的基本单位,i是它在整个串中的序号;n为串的长度,表示串中所包含的字符个数。
2.几个术语(1)长度串中字符的个数,称为串的长度。
(2)空串长度为零的字符串称为空串。
(3)空格串由一个或多个连续空格组成的串称为空格串。
(4)串相等两个串相等,是指两个串的长度相等,且每个对应字符都相等。
(5)子串串中任意连续字符组成的子序列称为该串的子串。
(6)主串包含子串的串称为该子串的主串。
(7)模式匹配子串的定位运算又称为串的模式匹配,是一种求子串的第一个字符在主串中序号的运算。
被匹配的主串称为目标串,子串称为模式。
3.串的基本运算(1)求串长:LenStr(s)。
(2)串连接:ConcatStr(s1,s2) 。
(3)求子串:SubStr (s,i,len)。
(4)串比较:EqualStr (s1,s2)。
(5)子串查找:IndexStr (s,t),找子串t在主串s中首次出现的位置(也称模式匹配)。
(6)串插入:InsStr (s,t,i)。
(7)串删除:DelStr(s,i,len)。
4.串的存储(1)定长顺序存储。
(2)链接存储。
(3)串的堆分配存储。
5.2 典型习题分析【例1】下面关于串的的叙述中,哪一个是不正确的?()A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储分析:空串是不含任何字符的串,即空串的长度是零。
空格串是由空格组成的串,其长度等于空格的个数。
答案为B。
【例2】两个串相等的充分必要条件是( )。
A.两个串长度相等B.两个串有相同字符C.两个串长度相等且有相同字符D.以上结论均不正确分析:根据串相等定义,两个串是相等是指两个串的长度相等且对应字符都相等,故A、B、C均不正确,答案为D。
【例3】串链式存储的优点是(1),缺点是(2)。
分析:由链式存储结点特点可以得到:(1)插入、删除方便。
(2)浪费空间。
注意,这里串的链式存储是指结点元素为1个字符的链串,如果结点元素字符数大于1,插入和删除同样不方便,但空间利用率可以提高。
【例4】设S="abccdcdccbaa",T="dccb",则第7 次匹配成功。
分析:由字符串模式匹配概念,匹配过程如下:S="abccdcdccbaa"第一趟 d 不成功S="abccdcdccbaa"第二趟 d 不成功S="abccdcdccbaa"第三趟 d 不成功S="abccdcdccbaa"第四趟 d 不成功S="abccdcdccbaa"第五趟dcc 不成功S="abccdcdccbaa"第六趟 d 不成功S="abccdcdccbaa"第七趟dccb 成功【例5】利用函数LenStr(s),SubStr (s,i,len)和ConcatStr(s1,s2)写一算法void StrInsert(char *S, char *T, int i),将串T插入到串S的第i个位置上。
若i大于S的长度,则插入不执行。
请在处填写语句,完成此程序。
算法如下:void InsStr (char *S, char *T, int i) // 将串T插入到串S的第i个位置上{char *Temp;Temp=(char *)malloc(sizeof(char[Maxsize]));// 设置一个临时串if(i<= LenStr(S)){ (1) ; // 将第i位起以后的字符拷贝到临时串中S= (2) ;// 将串T拷贝到串S的第i个位置处,覆盖后面的字符S= (3) ; // 把临时串中的字符联接到串S后面free( Temp );}分析:(1)因为是将串S第i个位置起以后字符复制到临时串变量Temp中采用求子串方法即Temp=SubStr(s,i,LenStr(S))。
(2)因为将串T拷贝到串S的第i个位置处,覆盖后面的字符采用串连接方法,即ConcatStr(SubStr(S,0,i-1),T)。
(3)ConcatStr(SubStr(S,0,i-1),Temp)。
【例6】链式串上的子串定位。
分析:由于是链式串,所以对元素的存储表示与顺序存储串不同,在链式串中不是用下标指示元素,而是用指针指向元素。
程序如下:typedef struct node{ char data;struct node *next;} LinkStrNode;LinkStr *LinkStrNode(LinkStrNode *t,LinkStrNode *p){ LinkStrNode *pos,*qi,*qj;po s=t;qi=pos;qj=p;while(qi&&qj){ if (q1->data==qj->data){ qi=qi->next; qj=qj->next; }else{ pos=pos->next; // 模式右移,继续判断pos是否为有校位移qi=pos;qj=p;}}if (qj==NULL)return pos; // 匹配成功elsereturn NULL; // 匹配失败}【例7】一个文本串可用事先给定的字母映射表进行加密,例如,设字母映射表为:a b c d e f g h i j k l m n o p q r s t u v w x y zn g z q t c o b m u h e l k p b a w x f y I v r s j则字符串“encrypt”被加密为“tkzwsdf”。
试写一算法将输入的文本串进行加密后输出;另写一算法,将输入的加密文本串进行加密后输出。
算法如下:typedef struct{ char ch[2];[MaxStrSize];int length;} SeqString;void Encoding(char *s,seqString T){ int i,j;int m=T.length; // 字母表长int n=strlen(S); // 求文本的长度for(i=0;i<n;i++){ for(j=0;j<m;j++)if(S[i]==T.ch[0][j]){ printf("%c",T.ch[1][j]);break;}if (j==m)printf("%c is not in alphabet",S[i]);}}void DeCoding (char *S,seqString T) // 串S是待解密的文本{ int i,j;int m=T.length;int n=strlen(S);for(i=0;i<n;i++){ for(j=0;j<m;j++)if (S[i]==T.ch[1][j]){ printf("%c",T.ch[0][j]);break;}if (j==m)printf("%c is not in alphabet",S[i]);}}【例8】若S和T是用结点大小为1的单链表存储的两个串,试设计一个算法找出S中第一个不在T中出现的字符。
分析:查找过程是这样的,取S中的一个字符(结点),然后和T中所有的字符一一比较,直到比完仍没有相同的字符时,查找过程结束,否则再取S中下一个字符,重新进行上述过程。
算法如下:typedef struct node{ char data;struct node *next;} LinkStrNode;char SearchNo(LinkStrNode *S, LinkStrNode *T) // 查找不在T中出现的字符{LinkStrNode *p,*q;p=S;q=T;while (p) // 取S中结点字符{ while(q&&p->data!=q->data) // 进行字符比较q=q->next;if (q==NULL)return p->data; // 找到并返回字符值q=T; // 指针恢复串T的开始结点p=p->next;}printf("there's no such character.");return NULL;}5.3 单元练习5解答二.填空题答案(1)字符串(或串)(2)堆分配存储(3)顺序串(4)空间利用率低(5)效率低(6)空间利用率低(7)\0(8)空格的个数(9)空格串(10)字符都相同(11)8(12)Today is 30 July,2005 (13)July(14)<0(15)0(16)模式(17)有效位移(18)6(19)0(20)(n-m+1)*m四.程序题填空答案(1)①MAXLEN②r2->len③r1->len+i④'\0'⑤r1->len+r2->len(2)①)!= 或<>②&&③!=④tag=0⑤i++(3)①s->len②s->len③k④\0⑤i-1五.编程题答案(1)①分析:从头至尾扫描r串,对于值为ch1的元素直接替换成ch2即可。
【程序代码】str *trans (str *r,char ch1,char ch2){ int i;for (i=0;i<r->len;i++)if (r->vec[i]==ch1)r-vec[i]=ch2;return(r);}②分析:将第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,依次类推,便将该串的所有字符反序了。
【程序代码】str *invert (str *r){ int i;char x;for (i=0;i< (r->len%2) ;i++){ x=r->vec[i];r->vec[i]=r->[r->len-i+1];r->vec[r->len-i+1]=x;}return (r );}③分析:从头到尾扫描r串,对于值为ch的元素用移动的方式进行删除。
【程序代码】str *delall (str *r,char ch)str *r;char ch;{ int i,j;for (i=0;i<r->len;i++)if (r->vec[i]==ch){ for (j=i;j<r->len;j++)r->vec[i]=r->vec[i+1];r->len=r->len-1;}return (r );}④分析:从第index个元素开始扫描r1,当其元素值与r2的第一个元素的值相同时,判定它们之后的元素值是否依次相同,直到r2结束为止,若都相同则返回,否则继续上述过程直到r1扫描完为止。