完整word版数据结构知识点全面总结精华版.docx
《完整word版数据结构知识点全面总结精华版.docx》由会员分享,可在线阅读,更多相关《完整word版数据结构知识点全面总结精华版.docx(50页珍藏版)》请在冰豆网上搜索。
完整word版数据结构知识点全面总结精华版
第1章绪论
内容纲要:
◆数据构造研究的内容。
针对非数值计算的程序设计问题,研究计算机的操作对象以及它们之间的关系和操作。
数据构造涵盖的内容:
◆根本看法:
数据、数据元素、数据对象、数据构造、数据种类、抽象数据种类。
数据——全部能被计算机鉴别、储藏和办理的符号的会集。
数据元素——是数据的根本单位,拥有完满确定的实质意义。
数据对象——拥有相同性质的数据元素的会集,是数据的一个子集。
数据构造——是相互之间存在一种或多种特定关系的数据元素的会集,表示为:
Data_Structure=〔D,R〕
数据种类——是一个值的会集和定义在该值上的一组操作的总称。
抽象数据种类——由用户定义的一个数学模型与定义在该模型上的一组操作,它由根本的数据种类组成。
◆算法的定义及五个特点。
算法——是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入变换为输出的计算步骤。
算法的根本特点:
输入、输出、有穷性、确定性、可行性
◆算法设计要求。
①正确性、②可读性、③强壮性、④效率与低储藏量需求
◆算法解析。
时间复杂度、空间复杂度、牢固性
学习要点:
◆数据构造的“三要素〞:
逻辑构造、物理〔储藏〕构造及在这种构造上所定义的操作〔运算〕。
◆用计算语句频度来估计算法的时间复杂度。
第二章线性表
内容纲要:
◆线性表的逻辑构造定义,对线性表定义的操作。
线性表的定义:
用数据元素的有限序列表示
◆线性表的储藏构造:
次序储藏构造和链式储藏构造。
次序储藏定义:
把逻辑上相邻的数据元素储藏在物理上相邻的储藏单元中的储藏构造。
链式储藏构造:
其结点在储藏器中的地址是随意的,即逻辑上相邻的数据元素在物理上不用然相邻。
经过指针来实现!
◆线性表的操作在两种储藏构造中的实现。
数据构造的根本运算:
更正、插入、删除、查找、排序
1)更正——经过数组的下标即可接见某个特定元素并更正之。
核心语句:
V[i]=x;
次序表更正操作的时间效率是O
(1)
2)插入——在线性表的第i个地址前插入一个元素
实现步骤:
①将第n至第i位的元素向后搬动一个地址;
②将要插入的元素写到第i个地址;
③表长加1。
注意:
早先应判断:
插入地址i可否合法?
表可否已满
应当吻合条件:
1≤i≤n+1或i=[1,n+1]
核心语句:
?
for(j=n;j>=i;j--)
a[j+1]=a[j];
a[i]=x;
n++;
插入时的平均搬动次数为:
n(n+1)/2÷〔n+1〕=n/2≈O(n)
3)删除——删除线性表的第i个地址上的元素
实现步骤:
①将第i+1至第n位的元素向前搬动一个地址;
②表长减1。
注意:
早先需要判断,删除地址i可否合法?
应当吻合条件:
1≤i≤n或i=[1,n]
核心语句:
for(j=i+1;j<=n;j++)
a[j-1]=a[j];
n--;
序表除一元素的效率:
T〔n)=(n-1)/2≈O(n)
序表插入、除算法的平均空复度O
(1)
表:
〔1〕
用表构来存放
26个英文字母成的性表〔
a,b,c,⋯,
z〕,写出
C言程序。
#include
#include
typedefstructnode{
chardata;
structnode*next;
}node;
node*p,*q,*head;
intn;
intm=sizeof(node);
//一般需要3个指量
//数据元素的个数
/*构型定好此后,每个
m求一次即可*/
node型的度就固定了,
voidbuild()
{
//字母表的生成。
要一个个慢慢入
inti;
head=(node*)malloc(m);
//m=sizeof(node)
前面已求出
p=head;
for(i=1;i<26;i++)
//因尾点要特别理,故
i≠26
{
p->data=i+‘a’-1;p->next=(node*)malloc(m);p=p->next;}p->data=i+‘a’-1;
//第一个点字符a
//后点“挖坑〞!
//指量P指向后一个点
//最后一个元素要独理
p->next=NULL;
//表尾点的指域要置空!
}
}
voiddisplay()//字母表的出
{
p=head;
while(p)//当指不空循〔限于无点的情况〕
{
printf("%c",p->data);
p=p->next;//指不断“藤摸瓜〞
}
}
〔2〕单链表的更正(或读取〕
思路:
要更正第i个数据元素,必定重新指针起素来找到该结点的指针
p,
尔后才能:
p>data=new_value
读取第i个数据元素的核心语句是:
Linklist*find(Linklist*head,inti)
{
intj=1;
Linklist*p;
P=head->next;
While((p!
=NULL)&&(j
{
p=p->next;
j++;
}
returnp;
}
3.单链表的插入
链表插入的核心语句:
Step1:
s->next=p->next;
Step2:
p->next=s;
6.单链表的删除
删除动作的核心语句〔要借助辅助指针变量q〕:
q=p->next;//第一保存b的指针,靠它才能找到
p->next=q->next;//将a、c两结点相连,裁汰b结点;
free(q);//完整释放b结点空间
c;
7.双向链表的插入操作:
设p已指向第i元素,请在第i元素前插入元素x:
①ai-1的后继从ai(指针是p)变为x〔指针是s):
s->next=p;p->prior->next=s;
②ai的前驱从ai-1(指针是p->prior)变为x(指针是s);s->prior=p->prior;p->prior=s;
8.双向链表的删除操作:
设p指向第后继方向:
i个元素,删除第
ai-1的后继由ai(
i个元素指针p)变为
ai+1(指针
p->next);
p->prior->next=p->next;
前驱方向:
ai+1的前驱由ai(指针p)变为ai-1(指针p->prior);
p->next->prior=p->prior;
◆数组的逻辑构造定义及储藏
数组:
由一组名字相同、下标不相同的变量组成
N维数组的特点:
n个下标,每个元素碰到n个关系拘束
一个n维数组能够看作是由假设干个n-1维数组组成的线性表。
储藏:
早先约定按某种次序将数组元素排成一列序列,尔后将这个线性序列存入储藏器中。
在二维数组中,我们既能够规定按行储藏,也能够规定按列储藏。
设一般的二维数组是A[c1..d1,c2..d2],那么行优先储藏时的地址公式为:
二维数组列优先储藏的通式为:
◆稀罕矩阵〔含特别矩阵〕的储藏及运算。
稀罕矩阵:
矩阵中非零元素的个数较少〔一般小于
5%〕
学习要点:
◆线性表的逻辑构造,指线性表的数据元素间存在着线性关系。
在次序储藏构造中,元素
储藏的先后地址反响出这种线性关系,而在链式储藏构造中,是靠指针来反响这种关系的。
◆次序储藏构造用一维数组表示,给定下标,能够存取相应元素,属于构。
随机存取的储藏结
◆链表操作中应注意不要使链不测“断开〞。
所以,假设在某结点前插入一个元素,或删除某元素,必定知道该元素的前驱结点的指针。
◆掌握经过画出结点图来进行链表〔单链表、循环链表等〕的生成、插入、删除、遍历等
操作。
◆数组〔主若是二维〕在以行序/列序为主的储藏中的地址计算方法。
◆稀罕矩阵的三元组表储藏构造。
◆稀罕矩阵的十字链表储藏方法。
补充要点:
1.每个储藏结点都包括两局部:
数据域和指针域(链域)
2.在单链表中,除了首元结点外,任一结点的储藏地址由
其直接前驱结点的链域的值
指示。
3.在链表中设置头结点有什么好处?
头结点即在链表的首元结点从前附设的一个结点,
表长度等附加信息,其作用是为了对链表进行操作时,
元结点进行一致办理,编程更方便。
该结点的数据域能够为空,也可存放能够对空表、非空表的情况以及对首
4.怎样表示空表?
(1〕无头结点时,当头指针的值为空时表示空表;
(2〕有头结点时,当头结点的指针域为空时表示空表。
5.链表的数据元素有两个域,不再是简单数据种类,编程时该怎样表示?
因每个结点最少有两个重量,且数据种类平时不一致,所以要采用构造数据种类。
6.sizeof(x)——计算变量x的长度〔字节数〕;
malloc(m)—开辟m字节长度的地址空间,并返回这段空间的首地址;free(p)——释放指针p所指变量的储藏空间,即完整删除一个变量。
7.链表的运算效率解析:
〔1〕查找
因线性链表只能次序存取,即在查找时要重新指针找起,查找的时间复杂度为O(n)。
〔2〕插入和删除
因线性链表不需要搬动元素,只要更正指针,一般情况下时间复杂度为O
(1)。
但是,若是要在单链表中进行前插或删除操作,由于要重新查找前驱结点,所耗时间复杂
度将是O(n)。
例:
在n个结点的单链表中要删除结点*P,需找到它的前驱结点的地址,其时间复杂
度为O〔n〕
8.次序储藏和链式储藏的差异和优缺点?
次序储藏时,逻辑上相邻的数据元素,其物理存放地址也相邻。
次序储藏的优点是储藏密度大,储藏空间利用率高;缺点是插入或删除元素时不方便。
链式储藏时,相邻数据元素可随意存放,但所占储藏空间分两局部,一局部存放结点值,
另一局部存放表示结点间关系的指针。
链式储藏的优点是插入或删除元素时很方便,使用灵便。
缺点是储藏密度小,储藏空间利用率低。
◆次序表合适于做查找这样的静态操作;
◆链表宜于做插入、删除这样的动向操作。
◆假设线性表的长度变化不大,且其主要操作是查找,那么采用次序表;
◆假设线性表的长度变化较大,且其主要操作是插入、删除操作,那么采用链表。
9.判断:
“数组的办理比其他复杂的构造要简单〞,对吗?
答:
对的。
由于——
①数组中各元素拥有一致的种类;
②数组元素的下标一般拥有固定的上界和下界,即数组一旦被定义,它的维数和维界就不再改变。
③数组的根本操作比较简单,除了结构的初始化和销毁之外,只有存取元素和更正元素值的操作。
10.三元素组表中的每个结点对应于稀罕矩阵的一个非零元素,它包括有三个数据项,分别表示该元素的行下标、列下标和元素值。
11.写出右所示稀罕矩的存形式。
解:
介3种存形式。
法1:
用性表表示:
((1,2,12),(1,3,9),(3,1,-3),(3,5,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7)〕
法2:
用十字表表示
用途:
方便稀罕矩的加减运算
方法:
每个非0元素占用5个域
法3:
用三元矩表示:
稀罕矩存的缺点:
将失去随机存取功能
代:
1.用数V来存放26个英文字母成的性表〔a,b,c,⋯,z〕,写出在序构上生成和示表的C言程序。
charV[30];
voidbuild()//字母线性表的生成,即建表操作
{
inti;
V[0]='a';
for(i=1;i<=n-1;i++)
V[i]=V[i-1]+1;
}
voiddisplay()//
{
字母线性表的显示,即读表操作
inti;
for(i=0;i<=n-1;
printf("%c",v[i]);
printf("\n");
i++)
}
voidmain(void)
{
//主函数,字母线性表的生成和输出
n=26;//n
是表长,是数据元素的个数,而不是
V的实质下标
build();
display();
}
第三章栈和行列
内容纲要:
◆从数据构造角度来讲,栈和行列也是线性表,其操作是线性表操作的子集,属操作受限的线性表。
但从数据种类的角度看,它们是和线性表大不相同的重要抽象数据种类。
◆栈的定义及操作。
栈是只准在一端进行插入和删除操作的线性表,该端称为栈的顶端。
插入元素到栈顶的操作,称为入栈。
从栈顶删除最后一个元素的操作,称为出栈。
对于向上生成的货仓:
入栈口诀:
货仓指针top“先压后加〞:
S[top++]=an+1
出栈口诀:
货仓指针top“先减后弹〞:
e=S[--top]
◆栈的次序和链式储藏构造,及在这两种构造下实现栈的操作。
次序栈入栈函数PUSH〔〕
statusPush(ElemTypee)
{if(top>M){上溢}
elses[top++]=e;
}
次序栈出栈函数POP()
statusPop()
{if(top=L){
下溢
}
else{e=s[--top];
return(e);}
}
◆行列的定义及操作,行列的删除在一端〔队尾〕,而插入那么在行列的另一端〔队头〕。
因
此在两种储藏构造中,都需要队头和队尾两个指针。
行列:
只幸亏表的一端进行插入运算,在表的另一端进行删除运算的线性表。
链行列
结点种类定义:
typedefStructQNode{
QElemTypedata;//元素
StructQNode*next;//指向下一结点的指针
}Qnode,*QueuePtr;
链行列种类定义:
typedef
struct{
QueuePtr
QueuePtr
front;//队首指针
rear;//队尾指针
}
LinkQueue;
链队表示图:
①空链队的特点:
front=rear
②链队会满吗?
一般不会,由于删除时有
③入队〔尾部插入〕:
rear->next=S;rear=S;
出队〔头部删除〕:
front->next=p->next;
free动作。
除非内存缺少!
2.次序队
次序队种类定义:
#define
QUEUE-MAXSIZE
100//最大行列长度
typedef
struct{
QElemType
int
int
*base;
//行列的基址
front;//队首指针
rear;//队尾指针
}SqQueue
建队核心语句:
q.base=(QElemType*)malloc(sizeof(QElemType〕
*QUEUE_MAXSIZE;
//分配空间
次序队表示图:
循环行列:
队空条件
:
front=rear
(初始化时:
front=rear)
队满条件:
front=(rear+1)%N
(N=maxsize)
行列长度〔即数据元素个数〕:
L=〔N+rear-front〕%N1〕初始化一个空行列
Status
InitQueue(SqQueue
&q)//
初始化空循环行列
q
{
q.base=(QElemType*)malloc(sizeof(QElemType〕
*QUEUE_MAXSIZE);//分配空间
if(!
q.base)exit(OVERFLOW);//内存分配失败,退出程序
q.front=q.rear=0;//置空行列
returnOK;
}//InitQueue;
2〕入队操作
Status
EnQueue(SqQueue
&q,
QElemTypee)
{//向循环行列q的队尾参加一个元素e
if((q.rear+1)%QUEUE_MAXSIZE==q.front)
returnERROR;//队满那么上溢,无法再入队
q.rear=(q.rear+1)%QUEUE_MAXSIZE;
q.base[q.rear]=e;//新元素e入队
returnOK;
}//EnQueue;
3〕出队操作
Status
DeQueue(SqQueue
&q,
QElemType&e)
{//假设行列不空,删除循环行列q的队头元素,
//由e返回其值,并返回OK
if(q.front==q.rear)returnERROR;//行列空
q.front=(q.front+1)%QUEUE_MAXSIZE;
e=q.base[q.front];
returnOK;
}//DeQueue
◆链行列空的条件是首尾指针相等,而循环行列满的条件的判断,那么有队尾加和设标志两种方法。
1等于队头
补充要点:
1.为什么要设计货仓?
它有什么独到用途?
①调用函数或子程序非它莫属;
②递归运算的有力工具;
③用于保护现场和恢复现场;
④简化了程序设计的问题。
2.为什么要设计行列?
它有什么独到用途?
①失散事件的模拟〔模拟事件发生的先后次序,比方CPU芯片中的指令译码行列〕;
②操作系统中的作业调换〔一个CPU执行多个作业〕;
③简化程序设计。
3.什么叫“假溢出〞?
怎样解决?
答:
在次序队中,当尾指针已经到了数组的上界,不能够再有入队操作,但其实数组中还有空地址,这就叫“假溢出〞。
解决假溢出的路子———采用循环行列。
4.在一个循环行列中,假设约定队首指针指向队首元素的前一个地址。
那么,从循环行列中删
除一个元素时,其操作是先搬动队首地址,后取出元素。
5.线性表、栈、队的异同点:
相同点:
逻辑构造相同,都是线性的;都能够用次序储藏或链表储藏;栈和行列是两种特别
的线性表,即受限的线性表〔可是对插入、删除运算加以限制〕。
不相同点:
①运算规那么不相同:
线性表为随机存取;
而栈是只赞同在一端进行插入和删除运算,所以是后进先出表LIFO;
行列是只赞同在一端进行插入、另一端进行删除运算,所以是先进先出表FIFO。
②用途不相同,线性表比较通用;货仓用于函数调用、递归和简化设计等;行列用于失散事件模拟、OS作业调换和简化设计等。
第四章串
内容纲要:
◆串是数据元素为字符的线性表,串的定义及操作。
串即字符串,是由零个或多个字符组成的有限序列,是数据元素为单个字符的特别线性表。
串比较:
intstrcmp(char*s1,char*s2);
求串长:
intstrlen(char*s);
串联接:
charstrcat(char*to,char*from)
子串T定位:
charstrchr(char*s,char*c);
◆串的储藏构造,因串是数据元素为字符的线性表,所以存在“结点大小〞的问题。
模式般配算法。
串有三种机内表示方法:
模式般配算法:
算法目的:
确定主串中所含子串第一次出现的地址〔定位〕
定位问题称为串的模式般配,典型函数为Index(S,T,pos)
BF算法的实现—即编写Index(S,T,pos)函数
BF算法设计思想:
将主串S的第pos个字符和模式T的第1个字符比较,
假设相等,连续逐个比较后续字符;
假设不等,从主串S的下一字符〔pos+1〕起,重新与T第一个字符比较。
直到主串S的一个连续子串字符序列与模式T相等。
返回值为S中与T般配的子序列
第一个字符的序号,即般配成功。
否那么,般配失败,返回值0。
IntIndex_BP(SStringS,SStringT,intpos)
{//返回子串T在主串S中第pos个字符此后的地址。
假设不存在,那么函数值为0.
//其中,T非空,1≤pos≤StrLength(S)
i=pos;j=1;
while(i<=S[0]&&j<=T[0])//
若是
i,j
二指针在正常长度范围,
{
if(S[i]==T[j]){++i,++j;}
//那么连续比较后续字符
else{i=i-j+2;j=1;}//假设不相等,指针退后重新开始般配
}
if(j>T[0])returni-T[0];//T子串指针j正常到尾,说明般配成功,elsereturn0;//否那么属于i>S[0]情况,i先到尾就不正常
}//Index_BP
补充要点:
1.空串和空白串有无差异?
答:
有差异。
空串(NullString)
而空白串(Blank
是指长度为零的串;
String),是指包括一个或多个空白字符‘
’(空格键
)的字符串
.
2.“空串是随意串的子串;随意串S都是S自己的子串,除S自己外,S的其他子串称为S
的真子串。
〞
第六章和二叉
内容纲要:
◆是复的非性数据构,,二叉的定,根本看法,。
:
由一个或多个(n≥0)点成的有限会集T,有且有一个点称根〔root〕,当n>1,其他的点分m(m≥0)个互不订交的有限会集T1,T2,⋯,Tm。
每个会集自己又是
棵,被称作个根的子。
二叉:
是n〔n≥0〕个点的有限会集,由一个根点以及两棵互不订