数据结构课后练习 - 第4章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四、简答题
1. 简述串的存储结构及各自的特点。 • 堆分配存储表示的特点是,仍以一组地址连续的存储单元 存放串值字符序列,但存储空间是在程序执行过程中动态 分配而得。所以也称为动态存储分配的顺序表。 • 在C语言中,利用动态存储管理函数malloc()和free(),来 根据实际需要动态分配和释放字符数组空间。 • 若分配成功,则返回一个指向起始地址的指针,作为串的 基址,同时,为了以后处理方便,约定串长也作为存储结 构的一部分。
S
S
h
e
n
d
a
# # ^
• 为了提高存储密度,可使每个结点存放多个字符。通常将 结点数据域存放的字符个数定义为结点大小。 • 显然,当结点大小大于1时,串的长度不一定正好是结点 的整数倍,则链表中的最后一个结点不一定全被串值占满, 此时通常补上“#”或其它的非串值字符(一般情况下“#” 不属于串的字符集,是一个特殊的符号)。 • 这种存储形式优点是存储密度高于结点大小为1 的存储形 式。不足之处是做插入、删除字符的操作时,可能会引起 结点之间字符的移动,算法实现起来比较复杂。
Chunk *head;
int curlen; } LinkString
}Chunk;
int index( LinkString r1, LinkString r2 ) { //链串上的子串定位操作 LinkString p, p1, q, q1; int i=0, pos=0; p=r1->head;
4. 字符串”VARTYPE int”,若采用动态分配的顺序存储方 A 法需要_______个字节(设每种数据均占用2个字节)。
A. 22 B. 11 C. 10 D. 动态产生,视情况而定
三、填空题
顺序存储结构 1. 串的两种最基本的存储方式是____________和 链式存储结构 ____________ 。 2. 串的链式存储结构是将存储区域分成一系列大小相同 数据 的节点,每个节点有两个域:____________域和 指针 ____________域。其中前者用于存储数据,后者用于 存储下一个节点的指针。
二、单项选择题
B 1. 串是一种特殊的线性表,其特殊性体现在_______。 A. 可以顺序存储 B. 数据元素是一个字符
C. 可以链接存储
D. 数据元素可以任意
二、单项选择题
C 2. 求字符串T在字符串S中首次出现的位置的操作为_______。 A. 求串的长度 A. 8 B. 37 B. 求子串 D. 9 C. 串的模式匹配 D. 串的连接 B 3. 若串S=”software”,其子串数目是_______。 C. 36
s3 SubString( s1, StringLength( s2), StringLength( s2))
• StringLength(s2): 7; • s3=Substring(s1, 7, 7): “ghijklm”.
四、简答题
3. 分析下述两个算法的具体功能。
SEQSTRING fun1(SEQSTRING *S, seqstring *T) { //S和T为顺序存储的串变量 SEQSTRING *R; int i,j; 将串S与串T联接后赋值给R for(i=0;i<S->len;i++) R->ch[i]=S->ch[i]; for(j=0;j<=T->len;j++) R->ch[S->len+j]=T->ch[j]; R->len=i+j; return(R);
?显然当结点大小大于1时串的长度不一定正好是结点的整数倍则链表中的最后一个结点不一定全被串值占满此时通常补上时串的长度不一定正好是结点的整数倍则链表中的最后一个结点不一定全被串值占满此时通常补上或其它的非串值字符一般情况下不属于串的字符集是一个特殊的符号
第一章 绪论
4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4.4 串操作应用举例
• Substring(s1,4,2): „de‟;
• Substring(s1,14,1): „n‟;
• Substring(s1,20,1): „t‟. • 连接的结果: s2=„student‟.
四、简答题
2. 字符串s1=„abcdefghijklmnopqrstuvw‟,由如下运算分别 得到s2和s3,请给出s2和s3的值。
s3 SubString( s1, StringLength( s2), StringLength( s2))
四、简答题
2. 字符串s1=„abcdefghijklmnopqrstuvw‟,由如下运算分别得 到s2和s3,请给出s2和s3的值。
s 2 StringConcat( Substring( s1,19,3), SubString( s1,4,2), SubString( s1,14,1), Substring( s1,20,1)) • Substring(s1,19,3): „stu‟;
取子串:从串S1的第n1个字符 开始连续取n2个字符赋值给给 串T;
此时串T为串S的子串,其再主 串中的位置为n1。
五、程序设计题
1. 设计一个链串上实现串比较操作StringEqual(s, t)的算 法。
typedef struct {
char data; Chunk *next;
typedef struct {
while ( p!=NULL )
{ q=r2-head; while( q!=NULL ) { if ( p->data==q->data ) { p1=p->next; q1=q->next;
while( p1->data==q1->data ) //当前字符相同 { p1=p1->next; q1=q1->next; } if ( q1==NULL ) pos=i+1; //匹配成功返回位置 } else q=q->next; } p=p->next; //从主串的下一个字符开始重新比较 i++; } return pos;
四、简答题
1. 简述串的存储结构及各自的特点。 • 串的块链存储表示:用链表存储串,每个结点存储串的n 个字符,当串长不是n的整数倍时最后一个结点剩余位置 用空字符#补齐。 • 如串ABCDEFGHI当n=4时: head ABCD EF GH I # # # ^
• 当n=1时: head
A
B
C
I ^
}
2. 设计一个链串上实现子串定位操作的算法。 • 比较两个串的大小 int strcmp(hstring s,hstring t){ for(i=0; i<s.length && i<t.length; ++i) if(s.ch[i]!=t.ch[i] //每个字符两两比较 return(s.ch[i]-t.ch[i]);
return(p->data-q->data);
p=p->next; q=q->next; } return s.curlen-t.curlen; //所有字符相同时则比较长度
}
结束
}
四、简答题
3. 分析下述两个算法的具体功能。
SEQSTRING fun2(SEQSTRING S, int n1, int n2) { //S为顺序存储的串变量 SEQSTRING T; int i; for(i=0;i<n2;i++) T.ch[i]=S.ch[n1+i-1]; T.len=n2{ char *ch; int length; }hsring;
• 这种存储结构表示时的串操作仍是基于“字符序列的 复制” 。例如,串复制操作StrCopy(&T, S)的实现算 法是,若串T已存在,则先释放串T所占空间,当串S 不空时,首先为串T分配大小和串S长度相等的存储空 间,然后将串S的值复制到串T中。 • 又如,串插入操作StrInsert(&S,pos,T)的实现算法是, 为串S重新分配大小等于串S和串T长度之和的存储空 间,然后进行串值复制。
return s.length-t.length; //所有字符相同时则比较长度
} 在此基础上进行修改!
• 比较两个串的大小 int strcmp(LinkString s, LinkString t){ p=s->head; q=t->head; for(i=0; i<s.curlen && i<t.curlen; ){ if(p->data!=q->data //每个字符两两比较
四、简答题
2. 字符串s1=„abcdefghijklmnopqrstuvw‟,由如下运算分别 得到s2和s3,请给出s2和s3的值。
s 2 StringConcat( Substring( s1,19,3), SubString( s1,4,2), SubString( s1,14,1), Substring( s1,20,1))
四、简答题
1. 简述串的存储结构及各自的特点。
• 定长顺序存储表示(静态存储分配的顺应表):是用一组 连续的存储单元来存放串中的字符序列。
• 所谓定长顺序存储结构,是直接使用定长的字符数组来定 义,数组的上界预先给出: #define MAXSTRLEN 255 typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存串长
• 在顺序存储结构中,实现串操作的原操作为“字符序 列的复制”,操作的时间复杂度基于复制的字符序列 的长度。 • 在定长顺序存储表示中,如果在操作中出现串值序列 的长度超过上界MAXSTRLEN时,约定用截尾法处理;
• 这种情况不仅在求联接串时可能发生,在串的其它操 作中,如插入、置换等也可能发生。克服这个弊病只 有不限定串长的最大长度,即动态分配串值的存储空 间。
学习要点
1. 熟悉串的7种基本操作的定义,并能利用这些基本操 作来实现串的其它各种操作。 2. 熟练掌握串的定长顺序存储结构上实现串的各种操作 的方法。
3. 掌握串的堆存储结构以及在其上实现串操作的基本方 法。
一、判断对错题
1. 串中不可以包含有空白字符。( ×) 2. 子串是主串中字符构成的有限序列。(× )
相关文档
最新文档