数据结构讲义严蔚敏版第4章
严蔚敏数据结构-第四章 串

15
(2)S1串长 最大串长 串长<最大串长 串长 最大串长; S1,S2串长和 最大串长 串长和>最大串长 串长和 最大串长;
S1 6 a b c d e f S2 6 g h i j k l T 8 a b c d e f g h
3
串的抽象数据类型的定义: 串的抽象数据类型的定义: ADT String{ 数据对象: 数据对象:D={ai|ai∈CharacterSet, i=1,2,...,n, n>=0} 数据关系: 数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=2,...,n} 基本操作: 基本操作: StrAssign(&T, chars)
11
作业: 作业: 1.用5种串的基本操作(StrAssign、StrCompare、StrLen Concat、SubString)来逻辑实现StrInsert(&S, pos, T)操作 、 操作. )
Status StrInsert(String S, int pos , String T) { if ……….. return error; , , ); ); ); );
chars是字符串常量。生成一个其值等于chars的串 。 是字符串常量。生成一个其值等于 的串T。 是字符串常量 的串
StrCopy(&T, S)
存在则由串S复制得串 串S存在则由串 复制得串 存在则由串 复制得串T
StrEmpty(S)
存在则若S为空串 串S存在则若 为空串 返回真否则返回假 存在则若 为空串,返回真否则返回假
Sub返回串 的第pos个字符起长度为 返回串S的第 个字符起长度为len的子串 用Sub返回串S的第pos个字符起长度为len的子串
严蔚敏《数据结构(c语言版)习题集》答案第四章 串

林银花
一、教材说明:
1、 课题:《一定能摸到红球吗?》
2、 本节内容的地位和作用
在现代社会中,人们面临着更多的机会和选择,常常需要在不确定情境中作出合理的决策,概率正是通过对不确定现象和事件发生的可能性的刻画,来为人们更好的制定决策提供依据和建议.本节内容又是义务教育阶段,唯一培养学生从不确定的角度来观察世界的数学内容,让学生了解可能性是普遍的,有助于他们理解社会,适应生活.
(1) 每位同学从盒子中轮流摸球,记录下所摸球的颜色,并将球放回盒中.
(2) 做10次这样的活动,将最终结果填在表中.
(3) 全班将各小组活动进行汇总,摸到红球的次数是多少?摸到黄球的次数是多少?他们各占总数的百分比是多少?
(4) 你认为哪种颜色的球多?打开看一看.
(5) 如果从盒中任意摸出一球,你认为摸到哪种颜色的球可能性大? 学生阅读学习目标.
学生两人一组进行活动.一人摸一人记录.并交流.
题(1):学生先想象后画图,并通过搭建几何体验证学习成果。
题(2):学生四人一组进行活动,一人搭几何体,另三人画图并交流,如有异义,举手询问。依次轮流。 使学生明确学习目标,进入学习角色,做到有的放矢。
目的是使学生体会到进行概率试验时,一定要保证随机性.
课堂组织策略:创设贴近学生生活,生动有趣的问题情境,开展活泼、主动、有效的数学活动,组织学生主动参与、勤于动手、积极思考,使他们在自主探索和合作交流的过程中真正理解和掌握概率有关内容。
学生学习策略:明确学习目标,了解所需掌握的知识,在教师的组织、引导、点拨下主动地从事观察、试验、猜测、验证与交流等数学活动,从而真正有效地理解和掌握知识。
(3)、情感目标:
《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)

《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)【第一章绪论】1. 数据结构是计算机科学中的重要基础知识,它研究的是如何组织和存储数据,以及如何通过高效的算法进行数据的操作和处理。
本章主要介绍了数据结构的基本概念和发展历程。
【第二章线性表】1. 线性表是由一组数据元素组成的数据结构,它的特点是元素之间存在着一对一的线性关系。
本章主要介绍了线性表的顺序存储结构和链式存储结构,以及它们的操作和应用。
【第三章栈与队列】1. 栈是一种特殊的线性表,它的特点是只能在表的一端进行插入和删除操作。
本章主要介绍了栈的顺序存储结构和链式存储结构,以及栈的应用场景。
2. 队列也是一种特殊的线性表,它的特点是只能在表的一端进行插入操作,而在另一端进行删除操作。
本章主要介绍了队列的顺序存储结构和链式存储结构,以及队列的应用场景。
【第四章串】1. 串是由零个或多个字符组成的有限序列,它是一种线性表的特例。
本章主要介绍了串的存储结构和基本操作,以及串的模式匹配算法。
【第五章数组与广义表】1. 数组是一种线性表的顺序存储结构,它的特点是所有元素都具有相同数据类型。
本章主要介绍了一维数组和多维数组的存储结构和基本操作,以及广义表的概念和表示方法。
【第六章树与二叉树】1. 树是一种非线性的数据结构,它的特点是一个节点可以有多个子节点。
本章主要介绍了树的基本概念和属性,以及树的存储结构和遍历算法。
2. 二叉树是一种特殊的树,它的每个节点最多只有两个子节点。
本章主要介绍了二叉树的存储结构和遍历算法,以及一些特殊的二叉树。
【第七章图】1. 图是一种非线性的数据结构,它由顶点集合和边集合组成。
本章主要介绍了图的基本概念和属性,以及图的存储结构和遍历算法。
【总结】1. 数据结构是计算机科学中非常重要的一门基础课程,它关注的是如何高效地组织和存储数据,以及如何通过算法进行数据的操作和处理。
本文对《数据结构》第二版严蔚敏的课后习题作业提供了参考答案,涵盖了第1-7章的内容。
串-第4章-《数据结构题集》答案解析-严蔚敏吴伟民版

串-第4章-《数据结构题集》答案解析-严蔚敏吴伟民版习题集解析部分第4章串——《数据结构题集》-严蔚敏.吴伟民版源码使⽤说明链接☛☛☛课本源码合辑链接☛☛☛习题集全解析链接☛☛☛相关测试数据下载链接☛本习题⽂档的存放⽬录:数据结构\▼配套习题解析\▼04 串⽂档中源码的存放⽬录:数据结构\▼配套习题解析\▼04 串\▼习题测试⽂档-04源码测试数据存放⽬录:数据结构\▼配套习题解析\▼04 串\▼习题测试⽂档-04\Data⼀、基础知识题4.1❶简述空串和空格串(或称空格符串)的区别。
4.2❷对于教科书4.1节中所述串的各个基本操作,讨论是否可由其他基本操作构造⽽得,如何构造?4.3❶设s = ‘I AM A STUDENT’,t = ‘GOOD’,q = ‘WORKER’。
求:StrLength(s),StrLength(t),SubString(s, 8, 7),SubString(t, 2, 1),Index(s, ‘A’),Index(s, t),Replace(s, ‘STUDENT’, q),Concat(SubString(s, 6, 2), Concat(t, SubString(s, 7, 8)))。
4.4❶已知下列字符串a = ‘THIS’, f = ‘A SAMPLE’, c = ‘GOOD’, d = ‘NE’,b = ‘ ’.s = Concat(a, Concat(SubString(f, 2, 7), Concat(b, SubString(a, 3, 2)))),t = Replace(f, SubString(f, 3, 6), c),u = Concat(SubString(c, 3, 1), d),g = ‘IS’,v = Concat(s, Concat(b, Concat(t, Concat(b, u)))),试问:s,t,v,StrLength(s),Index(v, g),Index(u, g)各是什么?4.5❶试问执⾏以下函数会产⽣怎样的输出结果?void demonstrate(){StrAssign(s, ‘THIS IS A BOOK’);Replace(s, SubString(s, 3, 7), ‘ESE ARE’);StrAssign(t, Concat(s, ‘S’));StrAssign(u, ‘XYXYXYXYXYXY’);StrAssign(v, SubString(u, 6, 3));StrAssign(w, ‘W’);printf(‘t=’, t, ‘v=’, v, ‘u=’, Replace(u, v, w));}//demonstrate4.6❷已知:s = ‘(XYZ)+*’,t = ‘(X+Z)*Y’。
数据结构(C)严蔚敏——4

Data Structure 2013-7-10
a0,n-1 a1,n-1
…….. am-1 ,n-1
Page 9
5.3 矩阵的压缩存储
4 8 0 0 0
7 2 3 4
2 7 1 9
3 1 7 8
4 9 8 6
7 2 3 4
重点和难点
重点是学习数组类型的定义及其存储表示。
知识点
数组的类型定义、数组的存储表示、特殊矩阵的压缩存储表示方法、 随机稀疏矩阵的压缩存储表示方法。
Data Structure
2013-7-10
Page 1
5.1 数组的定义
数组是线性表的推广
数组可以看成是一种特殊的线性表,即线性表中数据元素本身也 是一个线性表。 a 01 a 02 ... a 0,n-1 a 00 a a11 a12 ... a1,n-1 列向量 10 A m×n = ... ... ... ... ... a m-1,0 a m-1,1 a m-1,2 ... a m-1,n-1
对称矩阵
n阶矩阵;
aij=aji
Data Structure
1i,j n
2013-7-10 Page 11
特殊矩阵
值相同的元素或者零元素在矩阵中的分布有一定规律。
7 2 3 4
0 7 1 9
0 0 7 8
0 0 0 6
三角矩阵
n阶矩阵; 下(上)三角矩阵:矩阵的上(下)三角(不 包括对角线)中的元均为常数c或零。
a 01 a 02 a11 a12 ... ... a m-1, a m-1,2 1
严蔚敏数据结构第四章答案

void String_Reverse(Stringtype s,Stringtype &r)//求s的逆串r{StrAssign(r,''); //初始化r为空串for(i=Strlen(s);i;i--){StrAssign(c,SubString(s,i,1));StrAssign(r,Concat(r,c)); //把s的字符从后往前添加到r中}}//String_Reverse4.11void String_Subtract(Stringtype s,Stringtype t,Stringtype &r)//求所有包含在串s中而t中没有的字符构成的新串r{StrAssign(r,'');for(i=1;i<=Strlen(s);i++){StrAssign(c,SubString(s,i,1));for(j=1;j<i&&StrCompare(c,SubString(s,j,1));j++); //判断s的当前字符c是否第一次出现if(i==j){for(k=1;k<=Strlen(t)&&StrCompare(c,SubString(t,k,1));k++); //判断当前字符是否包含在t中if(k>Strlen(t)) StrAssign(r,Concat(r,c));}}//for}//String_Subtract4.12int Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T替换为V,并返回置换次数{for(n=0,i=1;i<=Strlen(S)-Strlen(T)+1;i++) //注意i的取值范围if(!StrCompare(SubString(S,i,Strlen(T)),T)) //找到了与T匹配的子串{ //分别把T的前面和后面部分保存为head和tailStrAssign(head,SubString(S,1,i-1));StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1));StrAssign(S,Concat(head,V));StrAssign(S,Concat(S,tail)); //把head,V,tail连接为新串i+=Strlen(V); //当前指针跳到插入串以后n++;}//ifreturn n;}//Replace分析:i+=Strlen(V);这一句是必需的,也是容易忽略的.如省掉这一句,则在某些情况下,会引起不希望的后果,虽然在大多数情况下没有影响.请思考:设S='place',T='ace', V='face',则省掉i+=Strlen(V);运行时会出现什么结果?4.13int Delete_SubString(Stringtype &s,Stringtype t)//从串s中删除所有与t相同的子串,并返回删除次数{for(n=0,i=1;i<=Strlen(s)-Strlen(t)+1;i++)if(!StrCompare(SubString(s,i,Strlen(t)),t)){StrAssign(head,SubString(S,1,i-1));StrAssign(tail,SubString(S,i+Strlen(t),Strlen(s)-i-Strlen(t)+1));StrAssign(S,Concat(head,tail)); //把head,tail连接为新串n++;}//ifreturn n,}//Delete_SubString4.14Status NiBoLan_to_BoLan(Stringtype str,Stringtype &new)//把前缀表达式str转换为后缀式new{Initstack(s); //s的元素为Stringtype类型for(i=1;i<=Strlen(str);i++){r=SubString(str,i,1);if(r为字母) push(s,r);else{if(StackEmpty(s)) return ERROR;pop(s,a);if(StackEmpty(s)) return ERROR;pop(s,b);StrAssign(t,Concat(r,b));StrAssign(c,Concat(t,a)); //把算符r,子前缀表达式a,b连接为新子前缀表达式c push(s,c);}}//forpop(s,new);if(!StackEmpty(s)) return ERROR;return OK;}//NiBoLan_to_BoLan分析:基本思想见书后注释3.23.请读者用此程序取代作者早些时候对3.23题给出的程序.4.15void StrAssign(Stringtype &T,char chars&#;)//用字符数组chars给串T赋值,Stringtype的定义见课本{for(i=0,T[0]=0;chars[i];T[0]++,i++) T[i+1]=chars[i];}//StrAssign4.16char StrCompare(Stringtype s,Stringtype t)//串的比较,s>t时返回正数,s=t时返回0,s<t时返回负数{for(i=1;i<=s[0]&&i<=t[0]&&s[i]==t[i];i++);if(i>s[0]&&i>t[0]) return 0;else if(i>s[0]) return -t[i];else if(i>t[0]) return s[i];else return s[i]-t[i];}//StrCompare4.17int String_Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S中所有子串T 替换为V,并返回置换次数{for(n=0,i=1;i<=S[0]-T[0]+1;i++){for(j=i,k=1;T[k]&&S[j]==T[k];j++,k++);if(k>T[0]) //找到了与T匹配的子串:分三种情况处理{if(T[0]==V[0])for(l=1;l<=T[0];l++) //新子串长度与原子串相同时:直接替换S[i+l-1]=V[l];else if(T[0]<V[0]) //新子串长度大于原子串时:先将后部右移{for(l=S[0];l>=i+T[0];l--)S[l+V[0]-T[0]]=S[l];for(l=1;l<=V[0];l++)S[i+l-1]=V[l];}else //新子串长度小于原子串时:先将后部左移{for(l=i+V[0];l<=S[0]+V[0]-T[0];l++)S[l]=S[l-V[0]+T[0]];for(l=1;l<=V[0];l++)S[i+l-1]=V[l];}S[0]=S[0]-T[0]+V[0];i+=V[0];n++;}//if}//forreturn n;}//String_Replace4.18typedef struct {char ch;int num;} mytype;void StrAnalyze(Stringtype S)//统计串S中字符的种类和个数{mytype T[MAXSIZE]; //用结构数组T存储统计结果for(i=1;i<=S[0];i++){c=S[i];j=0;while(T[j].ch&&T[j].ch!=c) j++; //查找当前字符c是否已记录过if(T[j].ch) T[j].num++;else T[j]={c,1};}//forfor(j=0;T[j].ch;j++)printf("%c: %d\n",T[j].ch,T[j].num);}//StrAnalyze4.19void Subtract_String(Stringtype s,Stringtype t,Stringtype &r)//求所有包含在串s中而t中没有的字符构成的新串r{r[0]=0;for(i=1;i<=s[0];i++){c=s[i];for(j=1;j<i&&s[j]!=c;j++); //判断s的当前字符c是否第一次出现if(i==j){for(k=1;k<=t[0]&&t[k]!=c;k++); //判断当前字符是否包含在t中if(k>t[0]) r[++r[0]]=c;}}//for}//Subtract_String4.20int SubString_Delete(Stringtype &s,Stringtype t)//从串s中删除所有与t相同的子串,并返回删除次数{for(n=0,i=1;i<=s[0]-t[0]+1;i++){for(j=1;j<=t[0]&&s[i+j-1]==t[i];j++);if(j>m) //找到了与t匹配的子串{for(k=i;k<=s[0]-t[0];k++) s[k]=s[k+t[0]]; //左移删除s[0]-=t[0];n++;}}//forreturn n;}//Delete_SubString4.21typedef struct{char ch;LStrNode *next;} LStrNode,*LString; //链串结构void StringAssign(LString &s,LString t)//把串t赋值给串s{s=malloc(sizeof(LStrNode));for(q=s,p=t->next;p;p=p->next){r=(LStrNode*)malloc(sizeof(LStrNode));r->ch=p->ch;q->next=r;q=r;}q->next=NULL;}//StringAssignvoid StringCopy(LString &s,LString t)//把串t复制为串s.与前一个程序的区别在于,串s业已存在.{for(p=s->next,q=t->next;p&&q;p=p->next,q=q->next){p->ch=q->ch;pre=p;}while(q){p=(LStrNode*)malloc(sizeof(LStrNode));p->ch=q->ch;pre->next=p;pre=p;}p->next=NULL;}//StringCopychar StringCompare(LString s,LString t)//串的比较,s>t时返回正数,s=t时返回0,s<t 时返回负数{for(p=s->next,q=t->next;p&&q&&p->ch==q->ch;p=p->next,q=q->next);if(!p&&!q) return 0;else if(!p) return -(q->ch);else if(!q) return p->ch;else return p->ch-q->ch;}//StringCompareint StringLen(LString s)//求串s的长度(元素个数){for(i=0,p=s->next;p;p=p->next,i++);return i;}//StringLenLString * Concat(LString s,LString t)//连接串s和串t形成新串,并返回指针{p=malloc(sizeof(LStrNode));for(q=p,r=s->next;r;r=r->next){q->next=(LStrNode*)malloc(sizeof(LStrNode));q=q->next;q->ch=r->ch;}//for //复制串sfor(r=t->next;r;r=r->next){q->next=(LStrNode*)malloc(sizeof(LStrNode));q=q->next;q->ch=r->ch;}//for //复制串tq->next=NULL;return p;}//ConcatLString * Sub_String(LString s,int start,int len)//返回一个串,其值等于串s从start 位置起长为len的子串{p=malloc(sizeof(LStrNode));q=p;for(r=s;start;start--,r=r->next); //找到start所对应的结点指针rfor(i=1;i<=len;i++,r=r->next){q->next=(LStrNode*)malloc(sizeof(LStrNode));q=q->next;q->ch=r->ch;} //复制串tq->next=NULL;return p;}//Sub_String4.22void LString_Concat(LString &t,LString &s,char c)//用块链存储结构,把串s插入到串t的字符c之后{p=t.head;while(p&&!(i=Find_Char(p,c))) p=p->next; //查找字符cif(!p) //没找到{t.tail->next=s.head;t.tail=s.tail; //把s连接在t的后面}else{q=p->next;r=(Chunk*)malloc(sizeof(Chunk)); //将包含字符c的节点p分裂为两个for(j=0;j<i;j++) r->ch[j]='#'; //原结点p包含c及其以前的部分for(j=i;j<CHUNKSIZE;j++) //新结点r包含c以后的部分{r->ch[j]=p->ch[j];p->ch[j]='#'; //p的后半部分和r的前半部分的字符改为无效字符'#'}p->next=s.head;s.tail->next=r;r->next=q; //把串s插入到结点p和r之间}//elset.curlen+=s.curlen; //修改串长s.curlen=0;}//LString_Concatint Find_Char(Chunk *p,char c)//在某个块中查找字符c,如找到则返回位置是第几个字符,如没找到则返回0{for(i=0;i<CHUNKSIZE&&p->ch[i]!=c;i++);if(i==CHUNKSIZE) return 0;else return i+1;}//Find_Char4.23int LString_Palindrome(LString L)//判断以块链结构存储的串L是否为回文序列,是则返回1,否则返回0{InitStack(S);p=S.head;i=0;k=1; //i指示元素在块中的下标,k指示元素在整个序列中的序号(从1开始)for(k=1;k<=S.curlen;k++){if(k<=S.curlen/2) Push(S,p->ch[i]); //将前半段的字符入串else if(k>(S.curlen+1)/2){Pop(S,c); //将后半段的字符与栈中的元素相匹配if(p->ch[i]!=c) return 0; //失配}if(++i==CHUNKSIZE) //转到下一个元素,当为块中最后一个元素时,转到下一块{p=p->next;i=0;}}//forreturn 1; //成功匹配}//LString_Palindrome4.24void HString_Concat(HString s1,HString s2,HString &t)//将堆结构表示的串s1和s2连接为新串t{if(t.ch) free(t.ch);t.ch=malloc((s1.length+s2.length)*sizeof(char));for(i=1;i<=s1.length;i++) t.ch[i-1]=s1.ch[i-1];for(j=1;j<=s2.length;j++,i++) t.ch[i-1]=s2.ch[j-1];t.length=s1.length+s2.length;}//HString_Concat4.25int HString_Replace(HString &S,HString T,HString V)//堆结构串上的置换操作,返回置换次数{for(n=0,i=0;i<=S.length-T.length;i++){for(j=i,k=0;k<T.length&&S.ch[j]==T.ch[k];j++,k++);if(k==T.length) //找到了与T匹配的子串:分三种情况处理{if(T.length==V.length)for(l=1;l<=T.length;l++) //新子串长度与原子串相同时:直接替换S.ch[i+l-1]=V.ch[l-1];else if(T.length<V.length) //新子串长度大于原子串时:先将后部右移{for(l=S.length-1;l>=i+T.length;l--)S.ch[l+V.length-T.length]=S.ch[l];for(l=0;l<V.length;l++)S[i+l]=V[l];}else //新子串长度小于原子串时:先将后部左移{for(l=i+V.length;l<S.length+V.length-T.length;l++)S.ch[l]=S.ch[l-V.length+T.length];for(l=0;l<V.length;l++)S[i+l]=V[l];}S.length+=V.length-T.length;i+=V.length;n++;}//if}//forreturn n;}//HString_Replace4.26Status HString_Insert(HString &S,int pos,HString T)//把T插入堆结构表示的串S的第pos个字符之前{if(pos<1) return ERROR;if(pos>S.length) pos=S.length+1;//当插入位置大于串长时,看作添加在串尾S.ch=realloc(S.ch,(S.length+T.length)*sizeof(char));for(i=S.length-1;i>=pos-1;i--)S.ch[i+T.length]=S.ch[i]; //后移为插入字符串让出位置for(i=0;i<T.length;i++)S.ch[pos+i-1]=T.ch[pos]; //插入串TS.length+=T.length;return OK;}//HString_Insert4.27int Index_New(Stringtype s,Stringtype t)//改进的定位算法{i=1;j=1;while(i<=s[0]&&j<=t[0]){if((j!=1&&s[i]==t[j])||(j==1&&s[i]==t[j]&&s[i+t[0]-1]==t[t[0]])){ //当j==1即匹配模式串的第一个字符时,需同时匹配其最后一个i=i+j-2;j=1;}else{i++;j++;}}//whileif(j>t[0]) return i-t[0];}//Index_New4.28void LGet_next(LString &T)//链串上的get_next算法{p=T->succ;p->next=T;q=T;while(p->succ){if(q==T||p->data==q->data){p=p->succ;q=q->succ;p->next=q;}else q=q->next;}//while}//LGet_next4.29LStrNode * LIndex_KMP(LString S,LString T,LStrNode *pos)//链串上的KMP匹配算法,返回值为匹配的子串首指针{p=pos;q=T->succ;while(p&&q){if(q==T||p->chdata==q->chdata){p=p->succ;q=q->succ;}else q=q->next;}//whileif(!q){for(i=1;i<=Strlen(T);i++)p=p->next;return p;} //发现匹配后,要往回找子串的头return NULL;}//LIndex_KMP4.30void Get_LRepSub(Stringtype S)//求S的最长重复子串的位置和长度{for(maxlen=0,i=1;i<S[0];i++)//串S2向右移i格{for(k=0,j=1;j<=S[0]-i;j++)//j为串S2的当前指针,此时串S1的当前指针为i+j,两指针同步移动{if(S[j]==S[j+i]) k++; //用k记录连续相同的字符数else k=0; //失配时k归零if(k>maxlen) //发现了比以前发现的更长的重复子串{lrs1=j-k+1;lrs2=mrs1+i;maxlen=k; //作记录}}//for}//forif(maxlen){printf("Longest Repeating Substring length:%d\n",maxlen);printf("Position1:%d Position 2:%d\n",lrs1,lrs2);}else printf("No Repeating Substring found!\n");}//Get_LRepSub分析:i代表"错位值".本算法的思想是,依次把串S的一个副本S2向右错位平移1格,2格,3格,...与自身S1相匹配,如果存在最长重复子串,则必然能在此过程中被发现.用变量lrs1,lrs2,maxlen来记录已发现的最长重复子串第一次出现位置,第二次出现位置和长度.题目中未说明"重复子串"是否允许有重叠部分,本算法假定允许.如不允许,只需在第二个for语句的循环条件中加上k<=i即可.本算法时间复杂度为O(Strlen(S)^2).4.31void Get_LPubSub(Stringtype S,Stringtype T)//求串S和串T的最长公共子串位置和长度{if(S[0]>=T[0]){StrAssign(A,S);StrAssign(B,T);}else{StrAssign(A,T);StrAssign(B,S);} //为简化设计,令S和T中较长的那个为A,较短的那个为Bfor(maxlen=0,i=1-B[0];i<A[0];i++){if(i<0) //i为B相对于A的错位值,向左为负,左端对齐为0,向右为正{jmin=1;jmax=i+B[0];}//B有一部分在A左端的左边else if(i>A[0]-B[0]){jmin=i;jmax=A[0];}//B有一部分在A右端的右边else{jmin=i;jmax=i+B[0];}//B在A左右两端之间.//以上是根据A和B不同的相对位置确定A上需要匹配的区间(与B重合的区间)的端点:jmin,jmax.for(k=0,j=jmin;j<=jmax;j++){if(A[j]==B[j-i]) k++;else k=0;if(k>maxlen){lps1=j-k+1;lps2=j-i-k+1;maxlen=k; }}//for}//forif(maxlen){if(S[0]>=T[0]){。
数据结构(C)严蔚敏——3

Data Structure
2011-1-13
Page 4
串与线性表区别 串的数据对象约束为字符集。 串的数据对象约束为字符集。 字符集 串的基本操作与线性表有很大差别 串的基本操作与线性表有很大差别 基本操作
线性表的基本操作中,大多以“单个元素”作为操作对象, 线性表的基本操作中,大多以“单个元素”作为操作对象,如 查找某个元素、在某个位置上插入一个元素和删除一个元素。 查找某个元素、在某个位置上插入一个元素和删除一个元素。 串的基本操作中,通常以“串的整体”作为操作对象。 串的基本操作中,通常以“串的整体”作为操作对象。如在串 中查找某个子串、 中查找某个子串、在串的某个位置上插入一个子串以及删除一 个子串。 个子串。
Data Structure
2011-1-13
Page 12
定长顺序存储表示串操作的实现: 定长顺序存储表示串操作的实现:
设串的最大长度为10, 设串的最大长度为10, 10 S1=‘ABCDEF ABCDEF’ S1= ABCDEF S2=‘GHIJ GHIJ’ S2= GHIJ S3=‘KLMNOP KLMNOP’ S3= KLMNOP S4=‘QRSTUVWXYZ QRSTUVWXYZ’ S4= QRSTUVWXYZ S1连接S2,结果‘ABCDEFGHIJ 。 S1连接S2,结果‘ABCDEFGHIJ’。 连接S2 S1连接S3,结果‘ABCDEFKLMN’,S3的‘OP’部分被截断。 S1连接S3,结果‘ABCDEFKLMN ,S3的 OP 部分被截断。 连接S3 部分被截断 S4连接S1,结果‘QRSTUVWXYZ ,S1全部被截断 全部被截断。 S4连接S1,结果‘QRSTUVWXYZ’,S1全部被截断。 连接S1
由于我们现今使用的计算机的硬件结构主要是面向数值计 算的需要,基本上没有提供对串进行操作的指令,因此需 算的需要,基本上没有提供对串进行操作的指令, 用软件来实现串数据类型。 要用软件来实现串数据类型。
数据结构_(严蔚敏C语言版)_学 习、复习提纲

联接 比较 复制 子串查询
模式匹配 失败链接值
匹配算法 单字符链表串 多字符链表串
串变量的存储映像:
串名、串值对应关系表
第五章 数组和广义表 复习
数组
顺序存储方式 压缩存储方式 行优先顺序存放 列优先顺序存放 C语言数组:行优先 下标从[0]开始,公式变化 稀疏矩阵
应用 表达式 程序调用
广义表
运算
定义:n(≥0)个元素的有限序列 表头:Head(A)= a1
第八章 查找 复习
查找
概念: 查找的定义:确定一个已给的数据是否出现在某个数据表中。
MSL:最大查找长度:最多比较次数; ASL:平均查找长度:平均比较次数; 顺序表:记录的逻辑顺序与其在计算机存储器中存储的顺序一致
运算:联接
1、在双链表中,每个结点有两个指针域,包括一个指向前驱结点的指针 、一个指向后继结点的指针
2、线性表采用顺序存储,必须占用一片连续的存储单元 3、线性表采用链式存储,便于进行插入和删除操作 4、线性表采用顺序存储和链式存储优缺点比较。 5、简单算法
第三章 栈和队列 复习
栈
存储结构 栈的概念:在一端操作的线性表 运算算法 栈的特点:先进后出 LIFO 初始化 进栈push 出栈pop
二叉树 的遍历 已知先根、中根序列画树;已知后根、中根序列画树; 先根线索 中根线索 后根线索 线索 二叉树 线索树的画法
树、森林与二叉树的相互转换 树、森林的遍历
树、森林 二叉排序树
哈夫曼树 左中右ቤተ መጻሕፍቲ ባይዱ小中大
树的应用
哈夫曼树的画法 编码:左0右1
1、三个结点可以组成2种不同形态的树。 2、一个稀疏矩阵Am*n采用三元组形式表示,若完成了其的转置运算要 经过哪几步: 矩阵的行、列数值互换 、矩阵元素所在行列值互换、元素在矩阵中排 列的位置)重新排列 3、若二叉树中每一层结点的个数都达到了最大,则称为一棵满二叉 树。 4、树最适合用来表示现有元素之间具有分支层次关系的数据 5、哈夫曼树是带权路径长度最小的二叉树。 6、以下那些项为用十字链表表示的稀疏矩阵元素结点信息元素所在行 和列 、元素的值 、指向该元素所在行的下一个元素的指针 、指向 该元素所在列的下一个元素的指针。 7、一个广义表可以为其它广义表所共享。 8、广义表可以是一个多层次的结构。 9、压缩存储的三角矩阵和对称矩阵的存储空间相同。 10、广义表中的元素类型可以不相同。 11、两个稀疏矩阵的和仍为稀疏矩阵。 12、二叉树的先序遍历序列中,任意一个结点均处在其孩子结点的前 面。 13、对于一棵具有n个节点的树,该树中所有节点的度数之和为n-1。 14、树和森林的遍历中有中序遍历。 15、二叉树用链式存储时,空链域数多于非空链域数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
✉ 4.2 基本体的表面取点 ✉ 4.3 平面与立体表面的交线 结束放映✉ 4.1 基本体的三视图 ✉ 4.4 立体与立体表面的交线 ✉ 4.5基本体三维造型4.1 基本体的三视图常见的基本几何体平面基本体曲面基本体一、画基本体三视图的方法步骤1 .确定三个视图的位置。
选择立体上的一个点或立体的对称中心线、主要棱线、平面等作为画图参考基准;先画出它们的三个视图(布图),注意要做到横平竖直。
2.画出反映立体主要形状特征(实形)的视图。
3 .再根据立体的长、宽、高尺寸(相对坐标),依照“长对正、高平齐、宽相等”的规律,完成另外两个视图。
4 .视图完成后,应擦去作图辅助线。
∙立体是具有三维坐标的实心体,研究的立体投影是研究立体表面的投影。
∙立体是有具体形状和尺寸大小的形体。
画三视图时,主要用长、宽、高方向的相对坐标,与投影轴无关,从这里开始不再画出投影轴。
开始画三视图! 在图示位置时,五棱柱的上下两底面为水平面,在俯视图中反映实形(五边形).后侧棱面是正平面,其余四个侧棱面是铅垂面,它们的水平投影都积聚成直线,与五边形的边重合。
⑵ 五棱柱的三视图 ⑴ 棱柱的组成由上下两个底面和若干侧棱面组成。
侧棱面与侧棱面的交线叫侧棱线,侧棱线相互平行。
1.棱柱 二、平面基本体●a 0 ●a 0"●a 0' ●(1)布图:选点AO画图参考基准,画出其三个投影图。
2) 画出反映立体主要形状特征的俯视图。
(3) 由“长对正”和立体的高度画出主视图。
4利用“宽相等”和"高平齐”画出左(二求三)。
三视图概念棱锥处于图示位置时,其底面 ABC 是水平面,在俯视图上反映实形。
侧棱面SBC 为正垂面,另两个侧棱面为一般位置平面。
2.棱锥⑵ 三棱锥的三视图⑴ 棱锥的组成 由一个底面和若干侧棱面组成。
侧棱线交于有限远的一点——锥顶。
ABCS●a ●a "●a ' ●s '●b '(c ')s●s " ●b " 开始画三视图! (1)布图: 选点A为画图参考基准,画出其三个投影图。
(2) 画出反映底面实形的底面及锥顶 S 的水平投影。
(3) 由“长对正”和立体的高度画出主视图。
4)利用“宽相等”和"高平齐”画出左(二求三)。
三视图概念在图示位置时,圆柱轴线为铅垂线,圆柱的顶面和底面是水平面,水平投影为反映实形的圆。
圆柱面的俯视图积聚成一个圆;在另两个视图上分别是两个矩形。
三、回转体1.圆柱体⑵ 圆柱体的三视图 ⑶ 轮廓线素线的投影分析 与曲面的可见性的判断 ⑴ 圆柱体的组成 圆柱体由圆柱面和两个底面组成。
其中:圆柱面是由直线AA 1绕与它平行的轴线OO 1旋转而成。
直线 AA 1称为母线。
圆柱面上与轴线平行的任一直线称为圆柱面的素线.A 1 AOO 1 d ″ d 0″ (d ′ (d 0′ ))d(d 0)b ′ b 0′ b(b 0)b ″ b 0″ a(a 0)a 0′a ′ a ″ a 0″c ′ c 0′ c(c 0) (c ″ (c 0″ ) ) 开始画三视图! 1)布图:选回转轴和底面棱线为画图参考基准。
2) 画出反映立体主要形状特征的俯视图。
(3) 由“长对正”和立体的高度画出主视图。
4利用“宽相等”和"高平齐”画出左(二求三)。
轮廓线素线的投影分析与曲面的可见性的判断(1) AAO、CCO为对V面的转向轮廓线,它前边的点可见。
2BB、DD对W面的转向轮廓线,它左边的点可见。
转向轮廓线概念 三视图概念⑶ 轮廓线素线的投影分析 与曲面的可见性的判断 在图示位置,俯视图为一圆。
另两个视图为等腰三角形,三角形的底边为圆锥底面的投影,两腰分别为圆锥面不同方向的两条转向轮廓线的投影。
⑴ 圆锥体的组成 2.圆锥体⑵ 圆锥体的三视图 其中:圆锥面是由直线SA 绕与它相交的轴线OO 1旋转而成。
S 称为锥顶,直线SA 称为母线。
圆锥面上过锥顶的任一直线称为圆锥面的素线。
圆锥体由圆锥面和底面组成。
s " ●s ' ●s●aa ′a ″b ′ bb ″cc ′ (c ″ ) 开始画三视图! (1布图:选回转轴和底面棱线为画图参考基准。
(2) 画出反映立体主要形状特征的俯视图。
3由“长对正”和立体的高度画出主视图。
4)利用“宽相等”和"高平齐”画出左(二求三)。
d(d ′ ) d ″轮廓线素线的投影分析与曲面的可见性的判断 (1) S A、S C为对V面的转向轮廓线,它前边的点可见。
(2) S B、S D为对W面的转向轮廓线,它左边的点可见。
O 1OS A转向轮廓线概念三视图概念三个视图分别为三个和圆球的直径相等的圆,它们分别是圆球三个方向转向轮廓线的投影。
3.圆球其中:球面是圆母线以它的直径为轴旋转而成。
⑵ 圆球的三视图 ⑶ 轮廓线的投影与曲 面可见性的判断 ⑴ 圆球体的形成OO 1开始画三视图! 1布图:选三个圆的对称中心线作为画图的参考基准; 2) 画出球体的主(3) 画出球体的俯视图——圆;(4画出球体的左 视图——圆; 轮廓线素线的投影分析与曲面的可见性的判断 (1) 最大的正平圆A为对V面的转向轮廓线,它前边的点可见。
(2) 最大的水平圆B为对H面的转向轮廓线,它上边的点可见。
(3) 最大的侧平圆C为对W面的转向轮廓线,它左边的点可见。
a ′aa ″c ″cc ′bb ′b ″球体的表面是球面。
转向轮廓线概念三视图概念图示位置的圆环,是圆心为O 的正平圆绕一铅垂线旋转而成的,圆上任意点的运动轨迹为垂直于轴线的水平圆(纬圆)。
靠近轴线的半个母线圆形成的环面称内环面,远离轴线的半个母线圆形成的环面称外环面。
4.圆环⑵ 圆环的三视图 ⑶ 轮廓线的投影与曲面可见性的判断 ⑴ 圆环体的形成其中:环面是圆母线绕圆所在平面上,且在圆外的一直线为轴旋转而成。
开始画三视图! 轮廓线素线的投影分析与曲面的可见性的判断 (1) 前半外环面的投影可见,后半外环面和内环面的投影不可见; (2) 上半外、内环面的投影的投影可见,下半环面的投影不可见; (3) 左半外环面的投影可见,右半外环面和内环面的投影不可见; 圆环体的表面是环面。
转向轮廓线概念三视图概念4.2立体表面的取点一、立体表面取点的方法步骤1、根据已知立体表面上点的一个投影及其可见性,判断该点在立体上的位置;2、求第二个投影。
根据立体的投影情况有两种求法:①积聚性法:如果立体在某个投影图中的投影有积聚性,可直接在其有积聚性的投影图中得到点的第二个投影。
★先分析立体投影的积聚性,在哪个投影图上有积聚性,就先求点在那个投影图中的投影。
②辅助线法:如果立体在各投影图中的投影都没有积聚性,可利用过点作辅助线的方法得到点的第二个投影。
★辅助线应为直线或平行某投影面的圆。
3、利用点的投影规律求第三个投影。
即所谓“二求三”。
点的可见性规定:若点所在的平面的投影可见,点的投影也可见;若平面的 投影积聚成直线,点的投影也可见。
1.棱柱表面上取点 二、积聚性法例4-7 已知五棱柱表面上点的正面投影 ,求作另两投影。
f ' (e ')●f●f " ●e "●e第一步:由题给投影可看出,点F 在铅垂棱面AA 0BB 0上,其正面投影可见;点E 在正 平棱面DD 0EE 0上,其正面投影不可见.第二步:利用铅垂棱柱水平投影的积聚性,得到F 、E 的水平投影f 、e . 第三步:利用投影规律(长对正,高平齐,宽相等)求侧面投影f "、e "。
即 所谓“二求三”。
如果立体是棱柱、圆柱,它们在某个投影图中的投影往往有积聚性,可直接在其有积聚性的投影图中得到点的第二个投影。
注意:先分析立体投影的积聚性,在哪个投影图上有积聚性,就先求点在那个投影图中的投影。
2.圆柱表面上取点第一步:①由题给投影可看出,点A 在铅垂圆柱面的前半部;点B 在后半部.②点C 在侧面前转向轮廓线上.③点D 在上平面上.第二步:①利用铅垂圆柱水平投影的积聚性,得到A 、B 的水平投影a 、b .②利用点 C 在转向轮廓线上的从属性得到C 的水平投影c .③利用上水平面的积聚性得到D 的正面投影d′.第三步:利用投影规律(长对正,高平齐,宽相等)求第三投影a "、b "、c′和d″。
即所谓“二求三”。
例4-8 已知圆柱表面上点的一个投影 ,求作另两投影。
dc "a '(b ')●c●b●(b ″ )d ′●●d ″●ac ′ ●a ″●1.棱锥表面上取点 三、辅助线法如果立体是锥、球等,它们在各投影图中的投影都没有积聚性,此时可利用“点在线上,线在面上”的原理,利用过点作辅助线的方法得到点的第二个投影。
注意:辅助线应为直线或平行某投影面的圆。
第一步:由题给投影可看出,点D 位于前棱面SAB 上,点E 位于后棱面SAC 上,它们的正面投影重合,棱锥没有积聚性. 第二步: 在平面立体上过一点可做出多条直线,这里给出了三种不同的做辅助线方法,求得F 、E 的水平投影d 、e . 第三步:利用投影规律(长对正,高平齐,宽相等)求侧面投影d "、e "。
即所谓“二求三”。
例4-9 已知三棱锥表面上点D 和E 的正面投影,求作另两投影。
d '(e ') 方法一:过锥顶作辅助直线 1'(2')●●2 ●1e●● ● e " ●d'(e ') 方法二:作底边平行线为辅助线 ● dg ′ ●●g● ●●d '(e ') 方法三:任作一直线为辅助线 m′●n ′ ●m ● n●n ●●●● ●方法一:素线法2.圆锥表面取点例4-10 已知圆锥表面上点A 的正面投影,求作另两投影。
a ' 第一步:由题给投影可确定点A 位于圆锥的前表面上,并在右表面上,圆锥没有积聚性。
第二步:在圆锥上过一点可做出一条直素线,也做出一个纬圆,求得A 的水平投影a 。
第三步:利用投影规律(长对正,高平齐,宽相等)求得侧面投影a "。
即所谓“二求三”。
●1'● a ●1●(a ")a '方法二:纬圆法 ●a ●第一步:由题给投影可看出:①点A 在球的前上半部②点B 在V 面转向轮廓线上(下边)③点C 在H 面转向轮廓线上(右边)。
第二步:①利用在球面上做水平圆辅助线得到A 水平投影a ②利用点B 在V 面转向轮廓线上的从属性得到B 的正面投影b′③利用点C 在H 面转向轮廓线上的从属性得到C 的水平投影c 。
第三步:利用投影规律(长对正,高平齐,宽相等)求第三投影a "、b "和c′,即所谓“二求三”。