ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:453.75KB ,
资源ID:7654612      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7654612.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构整理期末复习.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构整理期末复习.docx

1、数据结构整理期末复习数据结构期末复习材料第一章1、数据元素之间关系的映像:()顺序映像(顺序存储结构):以相对的存储位置表示后继关系。(2)非顺序映像(链式存储结构):借助指针元素存储地址的指针表示数据元素之间的逻辑关系。2、 ADT定义的方法:数据对象、结构关系、基本操作。3、算法的定义:对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。算法的5要素:有穷性、确定性、可行性、输入、输出4、算法的评价衡量算法优劣的标准正确性(correctness):满足具体问题的需求可读性(readability):易读、易理解健壮性(robustness):当输入数据非法

2、时,算法能够做出反应或进行处理效率与低存储量:执行时间短、存储空间小第二章1、线性表是一种最简单的线性结构。线性结构 是一个数据元素的有序(次序)关系特点:存在唯一的一个“第一个”的数据元素;存在唯一的一个“最后一个”的数据元素;除第一个数据元素外,均有唯一的前驱;除最后一个数据元素外,均有唯一的后继。2、线性表类型的实现顺序映像 定义:用一组地址连续的存储单元依次存放线性表中的数据元素。(1)以“存储位置相邻”表示有序对,则有:LOC(ai) = LOC(ai-1) + l其中l是一个数据元素所占存储量LOC(ai) = LOC(a1) + (i-1)l特点:1、实现逻辑上相邻物理地址相邻

3、2、实现随机存取 (2)若假定在线性表中任何一个位置上进行插入的概率都是相等的,则移动元素的期望值为: ,时间复杂度为O(n)。若假定在线性表中任何一个位置上进行删除的概率都是相等的,则移动元素的期望值为: ,时间复杂度为O(n)。(3)顺序表的插入和删除操作:Status ListInsert_sq (SqList &L, int i ,ElemType e) /在线性表中第i个元素前插入一个元素 if(iL.length) return ERROR; if(L.length=L.listsize) /当前存储空间已满,增加分配 newbase=(ElemType)realloc(L.ele

4、m, (L.listsize+LISTINCREMENT)*sizeof(ElemType); if(!newbase) exit(OVERFLOW); /分配失败 L.elem=newbase; /新基址 L.listsize+=LISTINCREMENT;/增加存储容量 q=&(L.elemi1); /q为插入位置 for(p=&(L.elemL.length-1);p=q;-p) *(p+1)=*p; /元素后移 *q=e; /插入e +L.length; /表长增1 return OK/ ListInsert_sq Status ListDelete_sq(SqList &L,int

5、i,ElemType &e) /在线性表中删除第i个元素,并用e返回其值 /i的合法值为1iL.length if(iL.length) return ERROR; p=&(L.elemi1); /p为被删除元素的位置 e=*p; /被删除元素的值赋给e q=&(L.elemL.length-1); /q为表尾元素的位置 for(p;phead ;j=0;/插入位置可能是第一个元素前,所以 这里指向头结点 while(p & jnext;+j;/寻找第i-1个结点 if(p-next=NULL | ji-1) return Error; /i小于1或者大于表长+1 S=(Lnode *)mal

6、loc(sizeof(LNode);/生成新结点 s-data=e; s-next=p-next; p-next=s;/插入到L中p之后 return OK;/ ListInsert_L Status ListDelete_L(LinkList &L,int i,ElemType &e) /在带头结点的单链表中删除第i个结点,并由e返回其值 p=L-head; j=0; while(p-next & jnext; +j; if(!(p-next) | ji-1) return ERROR /删除位置不合理 q=p-next;p-next=q-next /删除结点 e=q-data; free(

7、q); /释放结点 return OK;/ ListDelete_L(3)创建单链表 Void CreateList_L1(LinkList &L,int n) /按输入逆序建立n个元素的单链表 L-head=(Lnode *)malloc(sizeof(LNode); L-head-next=NULL; /建立带头结点的空链 for(i=n;i0;-i) p= (Lnode *)malloc(sizeof(LNode); /生成新结点 scanf(&p-data);/输入元素值 p-next=L-head-next; L-head-next=p; /插入到表头 / CreateList_L1

8、Void CreateList_L2(LinkList &L,int n) /按输入顺序建立n个元素的单链表 L-head=(Lnode *)malloc(sizeof(LNode); L-head-next=NULL; /建立带头结点的空链 for(i=0;idata);/输入元素值 p-next=NULL; if(L-head-next=NULL) L-head-next=p; else q-next=p; q=p; /插入到表尾 / CreateList_L24、 循环链表:最后一个结点的指针域的指针又指回第一个结点的链表。和单链表的差别仅在于: 判别链表中最后一个结点的条件不再是“后继

9、是否为空”,而是“后继是否为头结点”。5、 双向链表的操作特点:1、“查询” 和单链表相同;2、“插入” 和“删除”时需要同时修改两个方向上的指针Typedef struct DuLnode ElemType data; /数据域 struct DuLNode *prior; /指向前驱的指针 struct DuLNode *next; /指向后继的指针DuLNode;Typedef struct DulList DulList *head;DullinkList;插入:在双向链表中的p结点前插入一个s结点 s-prior=p-prior; /* */ s-next=p; /* */ p-pr

10、ior-next=s; /* */ p-prior=s; /* */ 删除:在双向链表中删除p结点 p-prior-next=p-next; /* */ p-next-prior=p-prior; /* */ free(p); /* */ 第三章1、栈、队列的特点: 从数据元素间的逻辑关系看是线性表 从操作方式与种类看不同于线性表:栈与队列是操作受限的线性表2、栈的基本概念 栈-是限制仅在线性表的一端进行插入和删除运算的线性表。 栈顶(TOP)-允许插入和删除的一端。 栈底(bottom)-不允许插入和删除的一端。 空栈-表中没有元素。栈-又称为后进先出的线性表3、 栈中元素的特性:1、具有线

11、性关系2、后进先出4、 栈的进栈出栈规则:a) 按序进栈:有n个元素1,2,,n,它们按1,2, , n的次序进栈(i进栈时,1(i-1)应该已经进栈);b) 栈顶出栈:栈底最后出栈;c) 时进时出:元素未完全进栈时,即可出栈。5、栈的表示与实现顺序栈 即栈的顺序存储结构:一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。/*栈的顺序存储结构描述*/#define STACK_INIT_SIZE 100 /*存储空间的初始分配量*/#define STACKINCREMENT 10 /*存储空间的分配增量*/typedef struct SElemType *base; /*存储空间基址*

12、/ int top; /*栈顶指针*/ int stacksize; /*当前分配的存储容量*/SqStack;1、 附设一个栈底指针base,总是指向栈底。 2、 附设一个栈顶指针top。空栈时,top=base;非空栈时,总是指向栈顶元素1的位置。 栈满 s-top=s-stacksize 栈空 s-top=0 插入一个栈顶元素,指针top增1; 删除一个栈顶元素,指针top减1; 非空栈中的栈顶指针始终在栈顶元素的下一个位置上3、 进栈出栈void StackPush_sq(sqStack *s,int e) int *newbase;if(s-top=s-stacksize) newb

13、ase=(int *)realloc(s-base,(s-stacksize+STACKINCRMENT)*sizeof(int); if(!newbase) printf(overflow!); exit(1); s-base=newbase; s-stacksize+=STACKINCRMENT; s-bases-top=e; s-top+;int StackPop_sq(sqStack *s) if(s-top=0) printf(the stack is empty!n); exit(1); else s-top-; return(s-bases-top);链栈 :注意: 链栈中指针的

14、方向指向前驱结点!例:EXP=ab+(c-d/e) fv 前缀:+ab-c/defv 中缀:ab+c-d/ef v 后缀:abcde/-f+6、队列 队列:只允许在表的一端进行插入,而在表的另一端进行删除的线性表。 队尾(rear)允许插入的一端 队头(front)允许删除的一端 队列特点:先进先出(FIFO)7、队列类型的实现 链队列队列的链式表示和实现 顺序队列队列的顺序表示和实现 用一组连续的存储单元依次存放队列中的元素8、顺序队列运算时的头、尾指针变化设两个指针front,rear,约定:rear指示队尾元素;front指示队头元素前一位置初值front=rear=0空队列条件:Q.f

15、ront=Q.rear队列满:Q.rear-Q.front=MAXQSIZE入队列: Q.baserear+=x;出队列:x=Q.base+front;存在问题:设数组维数为M,则: 当rear-front=m时,再有元素入队发生溢出真溢出 当rear已指向队尾,但队列前端仍有空位置时,再有元素入队发生溢出假溢出!队列的顺序存储结构#define MAXQSIZE 100 /*队列的最大长度*/Typedef struct QElemType *base; /*动态分配存储空间*/ int front; /*头指针*/ int rear; /*尾指针*/SqQueue;/*将循环队列Sq初始化

16、置为空循环队列 */ void InitQueue(SqQueue *Sq) Sq-base= (QElemType *) malloc(MAXQSIZE*sizeof(QElemtype); if(!Sq-base) exit(1); Sq-front=Sq-rear=0; /* InitQueue*/* 在循环队列Sq的尾部入队一个新元素x */ void EnQueue(SqQueue *Sq,ElemType x) if(Sq-rear+1) % MAXQSIZE = Sq-front) exit(1); /*队列已满*/ Sq-baseSq-rear=x; Sq-rear=(Sq-r

17、ear+1) % MAXQSIZE;/* EnQueue*/*循环队列Sq出队一个元素,并存人y中*/int DelQueue(SqQueue *Sq) if(Sq-front=Sq-rear) exit(1); /*队列已空*/y=Sq-baseSq-front;Sq-front=(Sq-front+1) % MAXQSIZE ;return y;/* DelQueue*/ 9、 循环队列:将数组首尾相接(即:base0连在basem-1之后)。入/出队列运算 利用“模运算”,则: 入队:Q.rear=(Q.rear+1)% MAXQSIZE 出队:Q.front=(Q.front+1)%

18、MAXQSIZE即一个大小为MAXQSIZE的循环队列最多有MAXQSIZE-1个元素队满和队空判断条件: 队空:Q.rear=(Q.front) 队满:(Q.rear+1)% MAXQSIZE =Q.front10、 链队列typedef struct QNode QElemType data; struct QNode *next;QNode;typedef struct QNode *front; /*队头指针*/ QNode *rear; /*队尾指针*/LQueue;/* 在链队列Lq的尾部插入一个新的元素x */ void EnQueue_L(LQueue *Lq,ElemType

19、 x) QNode *p; p=(QNone *)malloc(sizeof(QNone); p-data=x; p-next=NULL ; Lq-rear-next=p;Lq-rear=p; /* EnQueue_L*/*删除队列Lq的队头元素,并存入y中*/ int DelQueue-L(LQueue *Lq) if(Lq-front=Lq-rear) exit(1); /*队列已空*/ p=Lq-front-next; /*p指向队头结点*/ y=p-data; Lq-front-next=p-next; if (Lq-rear=p ) Lq-rearLq-front;/*尾指针指向头结

20、点*/ free(p); return y; /* DelQueue-L*/第四章一、1、串的基本概念 串-由零个或多个字符组成的有限序列,一般记为:s=a1a2.an (n0) 串中字符的个数n称为串的长度;零个字符,即长度为零的串称为空串,用或表示。空串不等于空格串,空格串:由一个或多个空格组成的串子串:串中任意个连续的字符组成的子序列主串:包含子串的串相应地称为主串相等:两个串的长度相等,并且对应位置的字符都相同。2、串结构与线性表结构的比较:逻辑结构:极为相似,区别仅在于串的数据对象约束为字符集。基本操作:有很大差别1、线性表大多以“单个元素”作为操作对象2、串通常以“串的整体”作为操

21、作对象3、串类型定义4、 串赋值StrAssign、串复制Strcopy、串比较StrCompare、求串长StrLength、串联接Concat以及求子串SubString等六种操作构成串类型的最小操作子集。 1、 StrAssign (&T, chars) 初始条件:chars 是字符串常量。操作结果:把 chars 赋为 T 的值。等价于C语言中的strset函数2、 StrCopy (&T, S) 初始条件:串 S 存在。操作结果:由串 S 复制得串 T。等价于C语言中的strcpy函数3、 StrCompare (S, T) 初始条件:串 S 和 T 存在。操作结果:若ST,则返回值

22、0; 若ST,则返回值0; 若ST,则返回值0。等价于C语言中的strcmp函数(按ASCII码值进行大小比较)4、 StrLength (S) 初始条件:串 S 存在。操作结果:返回 S 的元素个数,称为串的长度。等价于C语言中的strlen函数5、 Concat (&T, S1, S2) 初始条件:串 S1 和 S2 存在。操作结果:用T返回由S1和S2联接而成的新串。例如: Concate( T, man, kind) 求得 T = mankind 等价于C语言中的strcat函数6、 SubString (&Sub, S, pos, len) 初始条件:串S存在,1posStrLeng

23、th(S) 且 0lenStrLength(S)-pos+1。 操作结果:用Sub返回串S的第pos个字符起长度为len的子串。子串为“串”中的一个字符子序列。例如:SubString( sub, commander, 4, 3),求得sub = man;SubString( sub, commander, 1, 9),求得sub = commander;SubString( sub, commander, 9, 1),求得sub = r;起始位置pos和子串长度len之间存在约束关系,pos+len=StrLength(S)+1 SubString(student, 5, 0) = ? 长度

24、为0的子串为“合法”串5、Index (S, T, pos) 初始条件:串S和T存在,T是非空串, 1posStrLength(S)。操作结果:若主串 S 中存在和串 T 值相同的子串, 则返回它在主串 S 中第pos个字符之后第一次出现的位置;否则函数值为0。“子串在主串中的位置”指子串中的第一个字符在主串中的位序。假设 S = abcaabcaaabc, T = bca Index(S, T, 1) =2 Index(S, T, 3) = 6 Index(S, T, 8) = 0 6、Replace (&S, T, V) 初始条件:串S, T和V均已存在,且T是非空串。 操作结果:用 V

25、替换主串 S 中出现的所有与(模式串)T 相等的不重叠的子串。例如:假设 S = abcaabcaaabca,T = bca若 V = x, 则经置换后得到 S = abcaabcaaabca7、StrInsert (&S, pos, T) 初始条件:串S和T存在, 1posStrLength(S)1。操作结果:在串S的第pos个字符之前插入串T例如:S = chater,T = rac,则执行 StrInsert(S, 4, T)之后得到S = cha racter二、串的表示和实现1、定长顺序存储表示:用一组地址连续的存储单元存储串值的字符序列,称为顺序串。可用一个数组来表示。特点:串的实

26、际长度可在这个预定义长度的范围内随意设定,超过预定义长度的串值则被舍去,称之为“截断” 。按这种串的表示方法实现的串运算时,其基本操作为 “字符序列的复制”顺序存储结构中,串操作的基本操作为“字符序列的复制”,其时间复杂度基于复制的字符序列的长度。定长顺序串结构类型#define MAXSTRLEN 150 typedef struct char cMAXSTRLEN; int len;SString; 2、堆分配存储表示:特点:仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得的。串操作实现的算法为:先为新生成的串分配一个存储空间,然后进行串值的复制。

27、3、串的模式匹配算法int Index(SString S,SString T,int pos)/从主串s的下标pos起,串t第一次出现的位置,成功返回位置序号,不成功返回0 i=pos; j=1; /主串从pos开始,模式串从1开始 while(i=S.len & jT.len) return i-T.len;/匹配成功时,返回起始位置 else return 0;/Index4、计算模式串的next函数值和修正的next函数值第六章一、树的定义1、树型结构:(非线性结构)至少存在一个数据元素有两个或两个以上的直接前驱(或直接后继)元素的数据结构。树的定义:是n(n0)个结点的有限集合T,对于任意一棵非空树,它满足:有且仅有一个特定的称为根(root)的结点;当n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,.,Tm,其中每个集合本身又是一棵树,称为根的子树。上述树的定义是一个递归定义。2、基本术语结点:包含一个数据元素及若干指向其子树的分支。结点的度:结点拥有的子树数。叶子(或终端)结点:度为零的结点。分支(或非终端)结点:度大于

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1