最新C语言版数据结构知识点汇总.docx
- 文档编号:26890608
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:16
- 大小:188.62KB
最新C语言版数据结构知识点汇总.docx
《最新C语言版数据结构知识点汇总.docx》由会员分享,可在线阅读,更多相关《最新C语言版数据结构知识点汇总.docx(16页珍藏版)》请在冰豆网上搜索。
最新C语言版数据结构知识点汇总
引言
☆线性表
(二)链式存储
用计算机解决问题一般步骤:
具体问题
编程、调试得到答案
插入新元素的时候只需要改变指针所指向的地址。
一般来说,用计算机解决一个具体问题时,大致经过以下几个步骤:
首先要从具体问题抽象出一个适当的数学模型,然后设计一个解此数学模型的算法,最后编出程序进行测试调整知道的到最终解答。
寻求数学模型的实质就是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。
三种经典的数学模型图书书目自动检索系统——线性关系博弈问题——树
城市道路问题——图
数据结构(datastructure)
简单的解释:
相互之间存在一种或多种特定关系的数据元素的集合。
数据间的联系有逻辑关系、存储联系,通常的数据结构指的是逻辑结构。
前面提到的三种经典的数学模型体现了数据结构的基本结构,数据结构通常有如下四种关系:
(1)集合结构
(2)线性结构(3)树形结构(4)图状结构
☆线性表
(一)
N个数据元素的有限序列
存储结构:
顺序存储结构、链式存储结构
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
12
13
15
22
34
38
43
☆二维数组与线性表如果某一线性表,它的每一个数据元素分别是一个线性表,这样的二维表在数据实现上通常使用二维数组。
二维数组的一个形象比喻——多个纵队形成的方块m*n
☆数组地址计算问题
题目描述:
已知N*(N+1)/2个数据,按行的顺序存入数组b[1],b[2],⋯中。
其中第一个下标表示行,第二个下标表示列。
若aij(i>=j,j=1,2,⋯,,n)存于b[k]中,问:
k,i,j之间的关系如何表示?
给定k值,写出能决定相应i,j的算法。
当需要在顺序存储的线性表中插入一个数据元素时,需要顺序移动后续的元素以“腾”出某个合适的位置放置新元素。
删除元素呢?
空栈
☆栈(考题分析)
(1998)栈S初始状态为空,现有5个元素组成的序列{1,2,3,4,5},对该序列在栈S上一次进行如下操作(从序列中的1开始,出栈后不再进栈):
进栈、进栈、进栈、出栈、进栈、出栈、进栈。
问出栈的元素序列是D
(A){5,4,3,2,1}(B){2,1}(C){2,3}(D){3,4}
☆队列
先进先出
允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。
☆循环队列头指针指向队列中队头元素的前一个位置,尾指针指示队尾元素在队列中的当前位置。
☆树
根、叶子、子树结点的度:
结点拥有的子树数
二叉树
☆二叉树
(R-F+N)modN
特点:
每个结点至多只有二棵子树,并且二叉树的子树有左右之分。
第i层至多有2i-1个结点(i>=1)
☆图的存储结构邻接矩阵
深度为K的二叉树最多有2k-1个结点(K>=1)
先(根)序遍历
ABDFGCEH中(根)序遍历
BFDGACHE后(根)序遍历
FGDBHECA
☆例题分析
与后序遍历:
DGEBHIFCA,画出此二叉树。
有向图、无向图、带权图的邻接矩阵☆排序冒泡排序选择排序快速排序希尔排序
、插入排序(InsertionSort)
1.基本思想:
每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,直到待排序数据元素全部插入完为止。
使数列依然有序;
2.排序过程:
【示例】:
[初始关键字][49]38659776132749J=2(38)[3849]659776132749J=3(65)[384965]9776132749J=4(97)[38496597]76132749J=5(76)[3849657697]132749J=6(13)[133849657697]2749J=7(27)[13273849657697]49J=8(49)[1327384949657697]
二、选择排序
1.基本思想:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
2.排序过程:
【示例】:
初始关键字[4938659776132749]第一趟排序后13[38659776492749]第二趟排序后1327[659776493849]第三趟排序后132738[9776496549]第四趟排序后13273849[49976576]第五趟排序后1327384949[979776]第六趟排序后132738494976[7697]第七趟排序后13273849497676[97]最后排序结果1327384949767697
三、冒泡排序(BubbleSort)1.基本思想:
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
2.排序过程:
设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂
浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
【示例】:
49131313131313133849272727272727653849383838383897653849494949497697654949494949137697656565656527277697767676764949497697979797
于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
2.排序过程:
【示例】:
初始关键字[4938659776132749]
第一次交换后[2738659776134949]
第二次交换后[2738499776136549]
J向左扫描,位置不变,第三次交换后[2738139776496549]
I向右扫描,位置不变,第四次交换后[2738134976976549]
J向左扫描[2738134976976549]
(一次划分过程)
初始关键字[4938659776132749]
一趟排序之后[273813]49[76976549]
二趟排序之后[13]27[38]49[4965]76[97]
三趟排序之后1327384949[65]7697最后的排序结果1327384949657697各趟排序之后的状态五、堆排序(HeapSort)
1.基本思想:
堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,
利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
2.堆的定义:
N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:
Ki≤K2iKi≤K2i+1(1≤I≤[N/2])
四、快速排序(QuickSort)
1.基本思想:
六、几种排序算法的比较和选择
在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:
R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小
1.选取排序方法需要考虑的因素:
(1)待排序的元素数目n;
(2)元素本身信息量的大小;
(3)关键字的结构及其分布情况;
(4)语言工具的条件,辅助空间的大小等。
2.小结:
(1)若n较小(n<=50),则可以采用直接插入排序或直接选择排序。
由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。
(2)若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。
(3)若n较大,则应采用时间复杂度为O(nlog2∏)的排序方法:
快速排序、堆排序或归并排序。
快
速排序是目前基于比较的内部排序法中被认为是最好的方法。
⑷在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:
当文件的n个关键字随机分布时,任何
借助于”比较”的排序算法,至少需要O(nlog2∏)的时间。
(5)当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。
线性结构:
串、栈、队列
串
一、串的概念
串又称为字符串,是由0个或多个字符组成的有限序列。
长度为0的串称为空串,它不包含任何字符。
串用和'括起来。
二、串的运算1•串的定义:
一般用一维数组实现串的运算,由此串的定义也用数组的形式来实现:
type
Stringtype=packedarray[1..80]Ofchar;
Var
s:
Stringtype;
另外,还有一种更简便的定义方法,禾IJ用turboPaSCal中的String类型:
Var
s:
String;
但是String类型有一个限制:
运用String类型定义的数据长度只能是1——255,也就是说不
能超过255个字符。
2.串的标准函数
在turboPaSCal中有如下标准函数可实现串的运算:
COPy(S,x,y):
获取从S的第X个位置开始的y个字符
ConCat(SI,s2,...,sn):
相等于s1+s2+..+sndelete(s,x,y):
将S中从第X个位置开始的y个字符删去insert(s1,s,x):
将SI插到S中的第X个位置
Iength(S):
获取S的长度
3.串的基本运算
⑴赋值
(2)连接
(3)求串长
(4)取子串
(5)求子串序号
(6)插入
(7)删除
(8)置换
三、串的匹配算法
示例:
四、练习题:
1•读入一英文句子,单词之间用空格或逗号隔开,统计其中单词个数,并输出各个字母出现的频率。
(句子末尾不一定用”•”结束)
(WOrdl)
2•—个句子,只含英文字母,单词间用空格或逗号作为分隔符。
统计句子中的单词数,如果含有其他的字符,则只要求输出错误信息及错误类型。
(WOrd2)
含有大写字母错误类型error1
数字(0-9)错误类型error2
其他非法字符错误类型error3
如输入:
Itis12!
输出:
error123
输入:
iam,aStUdent输出:
4
3•编码解码:
从键盘输入一个英文句子,设计一个编码、解码程序。
(String)
编码过程:
先键入一个正整数N(K=N<=26)o这个N决定了转换关系。
例如当Nh,输入
的句子为ABCXYZ时,则其转换码为ABCXYZ不变。
当N=2时,其转换码为BCDYZA,其它
的非字母字符不变。
为使编码较于破译,将转换码的信息自左而右两两交换,若最后仅剩单个字符则不换。
然后,将一开始表示转换关系的N根据ascii表序号化成大写字母放在最前面。
如:
abcABCxyzXYZ-/,1.n=3
1CdeCDEZabZAB-/,1.{根据N的值转换}
2ClCCeEDaZZbBA/-1,.{两两交换}
3CclCCeEDaZZbBA/-1,.{最后编码}
解码过程为编码的逆过程。
栈
1•栈的特点:
栈是一种线性表,对于它所有的插入和删除都限制在表的同一端进行,这一端叫做栈的“顶”,
另一端则叫做栈的“底”,其操作特点是“后进先出”。
2•栈的一般定义:
type
StaCk=record
data:
array[1..m]Ofdatatype;
t:
0..m
end;
Var
s:
stack;
3•栈的基本运算:
(1)栈的插入PUSh(S,x):
往栈St中推入一个值为X的项目;
若t=m贝UPrint('overflow')
否则t:
=t+1;data[t]:
=x;
(2)栈的弹出POP(S):
从栈St中弹出一个项目;
若t=0贝UPrinteUnderfIow')
否则t:
=t-1:
(3)读栈顶元素top(s,x):
把栈顶元素的值读到变量X中,栈保持不变;
若t=0贝UPrinteerror')
否则x:
=data[t];
(4)判栈是否为空SemPty(S):
这是一个布尔函数,当栈St中没有元素(即t=0)时,称它为空栈,函数取真值,否则值为假。
若t=0贝USemPty:
=true
否贝USemPty:
=false;
4.栈的应用之一一一计算表达式的值
(1)表达式的三种形式:
中缀表达式:
运算符放在两个运算对象中间,女口:
(2+1)*3;
后缀表达式:
不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,女口:
21+3*;
前缀表达式:
同后缀表达式一样,不包含括号,运算符放在两个运算对象的前面,女口:
*+213o
(2)表达式的计算:
由于后缀表达式中没有括号,不需判别优先级,计算严格从左向右进行,故计算一个后缀表达式要比计算机一个中缀表达式简单得多。
将中缀表达式转换为后缀表达式的算法思想:
•当读到数字直接送至输出队列中
•当读到运算符t时,
a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;
b.t进栈
•读到左括号时总是将它压入栈中
•读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,
再丢弃左括号。
运用后缀表达式进行计算的具体做法:
•建立一个栈S
•从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依
次弹出两个数分别到丫和X,然后以“X运算符Y”的形式计算机出结果,再压加栈S中
•如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束
5.栈的应用之二一一递归算法的非递归实现
示例:
队列
队列的特点:
队列也是一种线性表,对于它所有的插入都在队列的一端进行,所有的删除都在另一端进行,
进行删除的一端叫队列的“头”,进行插入的一端叫队列的“尾”,其操作特点是“先进先出”
2•队列的一般定义:
type
queue=record
data:
array[1..m]Ofdatatype;
head,tail:
1..m
end;
q:
queue;
3•队列的基本操作:
(1)队列的插入enq(q,x):
在队列q中插入一个值为X的元素,也称为进队;
q[tail]:
=x;
若tail=m则tail:
=1
否则taik=tail+1:
若tail=head贝UPrint('overflow')
(2)队列的删除deq(q):
从队列q中删除一个元素,也称为出队;
若tail=head贝UPrint('underflow')
否则
若head=m贝Uhead:
=1否贝Uhead:
=head+1;
(3)读队头元素head(q,x):
将队列q中头部元素的值读到X中;
若tail=head贝UPrint('error')
否则x:
=q[head];
(4)判队列是否为空qempty(q):
这是一个布尔函数,当q是空队列时,取真值,否则取假值。
若tail=head贝Uqempty:
=true否贝Uqempty:
=false;
3.队列的应用:
例:
设有一个表,记为L=(a1,a2,a3,...,an),其中
L——表名
a1,a2,a3,..,an表中元素。
当ai为数值时表示元素,当ai为大写字母时,表示另一个表,但不能循环定义。
例如,下
列的定义是合法的(约定L是第一个表的表名):
L=(3.4,3,4,K,8,0,8)
K=(15,5,8,P,9,4)
P=(4,7,8,9)
程序要求:
当全部表给出后,示出所有元素的最大元素。
思路:
⑴可以建立两种队列,一种队列是存放数值的数值队列Q1,并有Q1[A]到Q1[Z]共26条数
值队列,另一种队列Q2存放字母,表示将要向该字母所对应的数值队列输入数值的事件队列。
(2)根据题目要求,事件队列Q2中应先放入字母L,表示首先输入L数值队列的数据。
(3)从事件队列Q2中取出一个字母,并招待该字母对应的数值队列的数值输入,如果输入的数据中包含字母,则把字母放入事件队列中,并记录输入的数值中的最大值。
(4)重复(3)步骤,直到事件队列中为空。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 语言版 数据结构 知识点 汇总