自考数据结构同步辅导串讲.docx
- 文档编号:4258161
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:42
- 大小:37.27KB
自考数据结构同步辅导串讲.docx
《自考数据结构同步辅导串讲.docx》由会员分享,可在线阅读,更多相关《自考数据结构同步辅导串讲.docx(42页珍藏版)》请在冰豆网上搜索。
自考数据结构同步辅导串讲
数据结构自学考试同步辅导
----------------------------------------------------主讲:
欧增桂
第一章概论—考点精析
一,基本概念和术语
1.用计算机解决问题的实质是对数据的加工,处理.
2.数据是信息的载体,它能够被计算机识别,存储和加工处理.
3.数据元素是数据的基本单位.有时一个数据元素包括若干个数据项.
第一章概论—考点精析
4.编程序使计算机对机内表示的数据进行操作,得到所需的结果,这项工作称为数据处理.
5.数据结构指的是数据之间的逻辑关系,也称为数据的逻辑结构.包括线性结构和非线性结构两大类.
6.数据元素及其关系在计算机存储器内的表示,称为数据的存储结构.
第一章概论—考点精析
(1)存储实现
存储实现的基本目标是建立数据的机内表示
存储结构主要内容:
使用一个存储结点来存储一个数据元素;建立各存储结点之间的关联来表示数据元素之间的逻辑关系.
存储结点:
一个数据元素在存储结构中的存储
第一章概论—考点精析
(2)结点之间有如下四种存储方式:
顺序存储方式:
每个存储结点只含一个数据元素.所有的存储结点相继存储在一个连续的存储区内,用存储结点间的位置关系表示数据之间的逻辑关系.—随机存取
链接存储方式:
每一个存储结点不仅含一个数据元素,还包括指针.每一个指针指向一个与本结点有逻辑关系的结点,即用指针表示逻辑关系.—顺序存取
第一章概论—考点精析
索引存储方式:
每一个存储结点仅含一个数据元素,所有存储结点都连续存放,仅增加一个索引表.通过关键字直接存取
稠密索引表:
每个结点在索引表中都有一个索引项.给出结点地址.
稀疏索引表:
一组结点在索引表中仅对应一个索引项.给出该组结点的起始位置.
第一章概论—考点精析
散列存储方式:
每一个存储结点仅含一个数据元素,数据元素按散列(Hash)函数确定存储位置.—通过对关键字的计算映射.
第一章概论—考点精析
7.数据类型是一个值的集合以及在这些值上定义的一组操作的总称.
数据类型按其值能否分解,通常可分为原子(简单)类型和结构类型两种类型.
抽象数据类型
(AbstractDataType,ADT):
由一组数据结构和在该组数据结构上的一组操作组成.
抽象数据类型在C++中是通过类来描述的
第一章概论—考点精析
二,学习数据结构的意义
1.算法+数据结构=程序
2.解决问题的一个关键步骤是选择合适的数据结构表示该问题,然后才能写出有效的算法.
三,运算的描述
1.数据的运算是通过算法描述的,所以讨论算法是数据结构课程的重要内容之一.
第一章概论—考点精析
2.选用算法要考虑正确性,执行算法所需时间和存储空间,同时算法应易于理解,编码,调试等.在结构中:
(1)查找运算:
找出满足条件的结点的位置
(2)读取运算:
读出结构中指定位置上的内容
(3)插入运算:
在指定位置上增加一个新结点
(4)删除运算:
撤消指定位置上的结点
(5)更新运算:
修改指定结点的内容
第一章概论—考点精析
四,运算的实现
运算实现是在确定的存储结构下,用计算机语言描述实现某种操作的算法,成为运算实现,这是数据结构的主要内容.
类C语言进行算法描述
第一章概论—考点精析
五,算法的分析
1.包括时间和空间两个方面进行分析:
时间复杂度和空间复杂度
2.时间复杂度从好到坏的级别依次是:
常量阶O
(1),对数阶O(log2n),线性阶O(n),优化的平方阶O(n*log2n),平方阶O(N2),立方阶O(n3),指数阶O
(2),阶乘阶O(n!
)
第二章线性表—考点精析
一,线性表的逻辑结构—了解以下概念和术语:
线性表:
n(n≥0)个结点组成的有限序列
线性结构中的元素是有序的
元素个数可以为0—空表
元素的个数是有限的
同一线性表中的元素的类型,长度相同.
第二章线性表—考点精析
2.非空的线性结构有以下特点:
只有一个排在第一个的元素,称为线性结构的起始元素.
只有一个排在最后的元素,称为线性结构的终端元素.
除起始元素外,线性结构的其它元素,仅有一个直接前驱.
除终端元素外,线性结构的其它元素,仅有一个直接后继.
第二章线性表—考点精析
3.线性结构的逻辑表示如下:
L1=()L1是一个空的线性结构;
L2=(a,b,c,d,e)L2线性结构中有5个元素,a是起始元素,e是终端元素,c的直接前驱元素是b,c的直接后继元素是d,a元素的序号是1,c元素的序号是3.
第二章线性表—考点精析
4.线性表的长度:
线性表中元素的个数
L1=()L1线性表的长度为零
L2=(a,b,c,d,e)L2线性表的长度为5
第二章线性表—考点精析
5.线性表的基本运算包括(函数的结果值):
InitList(L)初始化,创建一个空表L
ListLength(L)求线性表L的长度
GetNode(L,i)读取表L的第i个元素
LocateNode(L,X)查找定位元素X的位置
InsertList(L,X,i)将X插入到表L的第i个位置
DeleteList(L,i)
将表中第i个位置上的元素删除
第二章线性表—考点精析
二,线性表的顺序存储结构
(一)概念和术语
顺序表:
将线性表的结点按逻辑次序依次存放在一组地址连续的存储单元中,采用这种方式存储的线性表称为顺序表.
在算法中,顺序表的存储形式是数组
顺序表—随机存取方式
第二章线性表—考点精析
(二)顺序表的运算
InitList(L)
初始化,创建一个长度为maxsize的空表L(固定长度)L.last=0
第二章线性表—考点精析
(5)插入运算
voidInsertList(SeqList*L,DataTypex,inti)
{intj;‖将新结点x插入到L指向的第i个位置
if(iLlength+1)
Error("positionerror");‖位置错return0
if(Llength>=ListSize)
Error("overflow");‖空间溢出
第二章线性表—考点精析
for(j=Llength-1;j>=i-1;j--)
Ldata[j+1]=Ldata[j];‖结点后移
Ldata[i-1]=x;‖插入x
Llength++;‖表长加1
}
第二章线性表—考点精析
(6)删除运算
voidDeleteList(SeqList*L,inti)
{intj;‖从L指向的表中删除的第i个结点
if(iLlength+1)
Error("positionerror");‖位置错return0
for(j=i;jlength,L.size,数组下标范围为0≤i≤length-1,例如:
for(i=0;ilength;i++)
表元素的值data,itemif(L.list[i]==data)
第二章线性表—考点精析
三,线性表的链式存储结构
(一)概念和术语
链表:
按链式存储方式存储的线性表,分为单链表,循环链表,双链表.
链表中的元素顺序用结点中的指针给出,即用指针表示结点间的逻辑关系,元素顺序与逻辑顺序一致.采用顺序存取方式.
3.链表的长度是可变的
第二章线性表—考点精析
4.单链表:
一个结点存放一个元素,结点包括存放元素值的数据域(data),指向下一个结点的指针域(next)
5.循环链表:
单链表的最后一个结点的指针指向表头结点.
6.双链表:
循环链表中的结点包含两个指针域,分别指向前驱结点和后继结点.
第二章线性表—考点精析
单链表和循环链表的结点结构:
双链表的结点结构:
next
data
Rlink
data
Llink
第二章线性表—考点精析
指针操作:
p,q为指针
指针移动,遍历:
p=p->next
将q指向的结点插入到p指向的结点之后:
q->next=p->next;p->next=q;
q指向要删除的结点,p指向其前一个结点:
p->next=q->next;
第二章线性表—考点精析
(二)链表的运算(单链表)
InitList(L)初始化,创建一个空表L,Lnext==Null
第二章线性表—考点精析
建立单链表的算法(头插入法)
LinkListCreatListF(void)
{charch;
LinkListhead;‖头指针
ListNode*s;‖工作指针
head=NULL;‖链表开始为空
ch=getchar();
第二章线性表—考点精析
while(ch!
='\n')‖生成新结点
{s=(ListNode*)malloc(sizeof(ListNode))
sdata=ch;
snext=head;‖第一次为NULL,以后使其指向插入前的第一个结点
head=s;‖使head指向新结点
ch=getchar();}
returnhead;‖返回头指针
}
第二章线性表—考点精析
在有头结点链表中查找一个结点(按值查找)
ListNode*LocateNode
(LinkListhead,DataTypekey)
{ListNode*p=headnext;
while(p&&pdata!
=key)‖表为空或不等
p=pnext;‖扫描下一结点
returnp;‖若p=NULL,查找失败,否则
p指向找到的结点
}
第二章线性表—考点精析
按输入的顺序建立单链表算法的时间复杂度为O(n).
建立有序单链表算法的时间复杂度为O(n2)
访问单链表的结点必须从表头指针开始
对于循环链表和双链表,从表中的任一结点出发,通过指针移动都能访问表结点.
链表的插入和删除只修改指针,不移动表元素.
第三章栈和队列—考点精析
一,栈
(一)栈的定义和基本运算—概念和术语
1.栈:
栈是限定仅在一端进行插入,删除的特殊线性表.
栈属于加了限定条件的线性结构
栈是后进先出的线性表
第三章栈和队列—考点精析
(4)进栈和出栈端称为栈顶,另一端称为栈底
(5)栈中元素个数为0时为空栈.
(6)栈中的元素个数为有限多个
(7)同一个栈中的元素的类型,长度相同
新进栈的元素称为栈顶元素
第三章栈和队列—考点精析
栈的基本运算包括:
InitStack(S)初始化,创建空栈
Push(S,X)进栈,X成为新的栈顶元素
Pop(S,X)出栈,将栈顶元素删除,元素的值赋给X
StackTop(S,X)读栈顶元素,不删除
StackEmpty(S)判断是否空栈,空栈为1,否则为0
StackFull(S)判断是否栈满,栈满为1,否则为0
第三章栈和队列—考点精析
(二)栈的顺序实现—概念和术语
(1)顺序栈:
栈的顺序存储结构
(2)栈的顺序实现:
使用一个数组data,栈底元素存放在data(0)中,top值为栈内元素个数及位置,空栈时top=-1
(3)使用一个结构体变量表示一个栈元素:
其中一个域为数组data,另一个为top
(4)使用指针变量S指向结构体:
SdataStop
第三章栈和队列—考点精析
2.顺序存储栈的运算
3.算法分析
Push(S,X)的时间复杂度为O
(1)
Pop(S,X)的时间复杂度为O
(1)
判断栈满的条件:
S->top==StackSize-1
判断栈空的条件:
S->top==-1
第三章栈和队列—考点精析
顺序存储进栈操作
voidPush(SeqStack*S,DataTypex)
{if(StackFull(S))
Error("Stackoverflow");//上溢
Sdata[++Stop]=x;
}
第三章栈和队列—考点精析
顺序存储退栈操作
DataTypePop(SeqStack*S)
{if(StackEmpty(S))
Error("Stackunderflow");//下溢
returnSdata[Stop--];
}
第三章栈和队列—考点精析
(三)栈的链接实现—概念和术语
(1)栈的链接实现:
使用链表实现栈的存储
(2)链栈:
链表的首元素定为栈顶元素,尾元素为栈底.
第三章栈和队列—考点精析
链栈进栈操作
voidPush(linkStack*S,DataTypex)
{StackNode*p=
(StackNode*)malloc(sizeof(StackNode));
pdata=x;
pnext=Stop;
Stop=p;
}
第三章栈和队列—考点精析
链栈退栈操作
DataTypePop(linkStack*S)
{DataTypex;
StackNode*p=Stop;
if(StackEmpty(S))
Error("Stackunderflow");
x=pdata;Stop=pnext;
free(p);returnx;
}
第三章栈和队列—考点精析
二,队列
(一)队列的定义及基本运算
1.队列:
限定仅能在一端进队,另一端出队的特殊线性表
加限制的线性结构
先进先出表
第三章栈和队列—考点精析
进队在队尾,出队在队首(头)
可以是空队
队列中的元素个数是有限的,可变的
元素的类型,长度相同
第三章栈和队列—考点精析
队列的基本运算包括:
InitQueue(Q)初始化,创建队列
EnQueue(Q,X)进队,X成为新的队尾元素
Dequeue(Q,X)出队,将队列头元素删除,元素的值赋给X.
QueueFront(Q,X)读队列头元素,不删除
QueueEmpty(S)判断是否空队列,空队为1,否则为0.
QueueFull(S)判断是否队列满,队满为1,否则为0
第三章栈和队列—考点精析
(二)顺序队列
队列的顺序存储,也称循环队列
使用数组data存放队列元素,范围data[0]~data[maxsize-1]
使用结构体变量表示队列,四个域:
数组data,整形变量队头front,队尾rear,队中元素个数count
第三章栈和队列—考点精析
(4)用指针变量指向结构体:
sqdata,sqfront,sqrear,sqcount
2.顺序队列运算
初始化
sqfront=0,sqrear=0,sqcount=0
sqdata的maxsize=10
第三章栈和队列—考点精析
(三)链队列
使用链表存储队列
单链表有一个头指针,链队列还应该有一个尾指针
第三章栈和队列—考点精析
进队算法(循环链表)
voidEnQueue(CirQueue*Q,DataTypex)
{if(QueueFull(Q))
Error("Queueoverflow");‖队满
Qcount++;‖队列元素个数加1
Qdata[Qrear]=x;‖新元素插入队尾
Qrear=(Qrear+1)%QueueSize;
}‖队列尾指针加1
第三章栈和队列—考点精析
出队算法(循环链表)
DataTypeDeQueue(CirQueue*Q)
{DataTypetemp;
if(QueueEmpty(Q))
Error("Queueunderflow");‖队空
temp=Qdata[Qfront];
Qcount--;‖队列元素个数减1
Qfront=(Qfront+1)%QueueSize;
returntemp;
}
第四章串—考点精析
一,串的基本概念
串(string):
零个或多个字符组成的有限序列.如:
S="a1a2a3a4……an"
空串(EmptyString):
长度为零的串
空白串(BlankString):
空格组成的串
子串:
模式串,主串:
目标串
模式匹配:
子串定位,串匹配
第四章串—考点精析
6.对于某一个i,0in-m,将目标串的子串T[i..i+m-1]和模式串P[0..m-1]进行比较,若相等,则称匹配成功
7.位置i称为位移
第四章串—考点精析
8.有效位移:
匹配成功
9.无效位移:
匹配失败
例:
设T[0..n-1]="adaabaabcaabaa",P=[0..m-1]="aab",其有效位移是:
T[2..4]=P[0..2]
T[5..7]=P[0..2]
T[9..11]=P[0..2]
第四章串—考点精析
二,串的运算
Length(S)求串长
intstrlen(char*s);
2.Copy(S1,S2)将串S2复制到S1中
char*strcpy(char*to,char*from);
3.Concatenation(S1,S2)连接,将S2复制到S1的末尾
char*strcat(char*to,char*from);
第四章串—考点精析
4.Compare(S1,S2)比较串S1和S2的大小
intstrcmp(char*s1,char*s2);
5.Index(S,c)定位c在S中的位置,不在S中时返回NULL
char*stechr(char*s,charc);
6.substr(char*s,inti,intj);
从串S中第i个位置开始取j个字符
第四章串—考点精析
三,串的存储结构
(一)串的顺序存储
1.静态存储分配:
直接使用定长字符数组
2.动态存储分配:
动态分配,释放字符数组
(二)串的链式存储
用单链表存储串,便于顺序串的插入,删除
第四章串—考点精析
(三)串的子串定位运算(模式匹配或串匹配)
1.顺序串
intNaiveStrMatch
(SeqStringT,SeqStringP)
{inti,j,k;
intm=P.length;
intn=T.length;
第四章串—考点精析
for(i=0;i<=n-m;i++)
{j=0;k=i;
while(j {k++;j++;}‖判定是否有效位移 if(j==m) returni;‖匹配成功 } return–1;‖匹配失败 } 第四章串—考点精析 2.链式串 LinkStrNode*LinkStrMatch (LinkStringT,LinkStringP) {LinkStrNode*shift,*t,*p; shift=T;‖shift表示位移 t=shift;p=P; 第四章串—考点精析 while(t&&p) {if(tdata==pdata) {t=tnext;p=pnext;} else{‖确定shift为无效位移 shift=shiftnext;‖右移,继续 t=shift;p=P;} } 第四章串—考点精析 if(p==NULL) returnshift‖匹配成功 else returnNULL;‖匹配失败 } 第五章多维数组和广义表—考点精析 多维数组 行优先顺序存储 在数组A[m][n]中,计算元素A[i][j]的地址: A[0][0]的地址加上位移量(i*n+j)*d 对于三维数组A[m][n][p],计算元素A[i][j][k]的地址: A[0][0][0]的地址加上位移量(i*n*p+j*p+k)*d 第五章多维数组和广义表—考点精析 当数组下界为1时,在数组A[m][n]中,计算元素A[i][j]的地址: A[1][1]的地址加上位移量[(i-1)*n+(j-1)]*d 对于三维数组A[m][n][p],计算元素A[i][j][k]的地址: A[1][1][1]的地址加上位移量[(i-1)*n*p+(j-1)*p+(k-1)]*d 第五章多维数组和广义表—考点精析 2.列优先顺序存储 在数组A[m][n]中,计算元素A[i][j]的地址: A[0][0]的地址加上位移量j*m+i 对于三维数组A[m][n][p],计算元素A[i][j][k]的地址: A[0][0][0]的地址加上位移量(k*m*n+j*m+i)*d 第五章多维数组和广义表—考点精析 当数组下界为1时,在数组A[m][n]中,计算元素A[i][j]的地址: A[1][1]的地址加上位移量[(j-1)*m+(i-1)]*d 对于三维数组A[m][n][p],计算元素A[i][j][k]的地址: A[1][1][1]的地址加上位移量[(k-1)*m*n+(j-1)*n+(i-1)]*d 第五章多维数组和广义表—考点精析 一,基本概念 特殊矩阵: 非零元素和零元素有一定规律 对称矩阵,三角矩阵,对角矩阵 2.稀疏矩阵: 非零元素远少于矩阵元素总和 3.广义表: 是n个元素a1a2a3……an的有限序列,其中ai或者是一个原子;或者是一个广义表 第五章多维数组和广义表—考点精析 二,矩阵的压缩存储 特殊矩阵的存储 对称矩阵: 只存储上三角或下三角的元素 三角矩阵: 常数共享一个存储空间 对角矩阵: 零元素存储到一个存储空间 第五章多维数组和广义表—考点精析 2.稀疏矩阵 三元组表: 对于矩阵Amn中的每一个非零元素,对应的三元组为(i,j,Aij) 带行表的三元组表: 加入一个行表,记录每行非零元素在三元组表中的起始位置 第五章多维数组和广义表—考点精析 仅考虑非零元素 存储非零元素的行号,列号及元素值构成的三元组(i,j,aij). 三元组线性表—把所有的三元组按行号为主序(主关键字),列号为辅序(次关键字)进行排列.例如: ((1,1,3),(1,4,5),(2,3,-2),(3,1,1),(3,3,4),(3,5,6),(5,3,-1)) 稀疏矩阵的存储结构 稀疏矩阵的顺序存储类型定义: structSMatrix {intm,n,t; ‖行,列,元素值 Triplesm[MaxTerms+1] } ‖s[0]不用,下标范围 1~MaxTerms 6 5 3 1 1 3 5 4 1 -1 3 5 4 3 3 -2 3 2 3 1 1 rowcolval 下标 1 2 3 4 5 6 7 ┇ MaxTerms 第五章多维数组和广义表—考点精析 用三元组表示的矩阵转置 voidTransMatrix (TriTupleTable*b,TriTupleTable*a) {intp,q,col; bm=an;bn=am;bt=at; if(bt<=0) Error("A=0"); q=0; 第五章多维数组和广义表—考点精析 for(col=0;colfor(p=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自考 数据结构 同步 辅导 串讲