数据结构知识点总结文档格式.docx
《数据结构知识点总结文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构知识点总结文档格式.docx(35页珍藏版)》请在冰豆网上搜索。
![数据结构知识点总结文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/10/42b3d14f-61ab-4215-8dd4-84be5f752e90/42b3d14f-61ab-4215-8dd4-84be5f752e901.gif)
是相互之间存在一种或多种特定关系的数据元素的集合。
在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构。
根据数据元素之间关系的不同特性,通常有下列4类基本结构:
(1)集合------------数据元素仅有同属一个关系的关系
(2)线性结构----------结构中数据元素之间存在一个对一个的关系(3)树形结构------------结构中的数据元素之间存在一个对多个的关系(4)图状结构或网状结构-----------结构中的数据元素之间存在多个对多个的关系
五、元素在存贮结构
(1)物理结构(存储结构):
它包括数据元素的表示和关系。
(2)逻辑结构
六、位bit:
在计算机中表示信息的最小单位是二进制的一位
七、元素element/节点node:
位串
八、数据域:
当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串
九、数据元素之间的关系在计算机中有两种不同的表示方法,顺序映像和非顺序映像,并由此得到两种不同的存储结构:
顺序存储结构(借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系)和链式存储结构(借助指示元素存储地址的指针表示数据元素之间的逻辑关系)。
算法设计要求:
(1)正确性
(2)可读性(3)健壮性(4)效率与低存储量需求
-------------------------------------------------------------------------------
线性表:
采用顺序存储,便于进行插入和删除的操作
顺序表的优点:
结构紧凑,存储空间利用率高,操作简单。
(存储密度大)
缺点:
它需要一块连续的存贮空间。
当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素时,应采用顺序存储结构。
若某线性表最常用的操作是存取任一指定序号的元素和最后进行插入和删除运算,则利用顺序表的存储方式最节省时间;
若某线性表最常用的操作是在最后一个元素之后插入一个元素和删除一个元素,则采用仅有尾指针的单循环链表的存储方式最节省时间。
设一个链表最常用的操作是在末尾插入结点或删除尾结点,则利用带头结点的双循环链表的存储方式最节省时间。
若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点,则利用带头结点的双循环链表的存储方式最节省时间。
链表的优点:
在空间的合理利用上和插入、删除时不需要移动,是线性表的首选存储结构。
(不必事先估计存储空间、所需空间与线性长度成正比)
缺点:
求线性表的长度时不如顺序存储结构(不可随机访问任一元素)
线性表在顺序存储时,查找第i个元素的时间同i的值无关;
线性表在链式存储时,查找第i个元素的时间同i的值成正比。
对于顺序存储的线性表,访问结点的时间复杂度为O
(1),插入和删除结点的时间复杂度为O(n)。
对于链式存储的线性表,访问第i个元素的时间复杂度为O(n)。
对于一个具有n个结点的单链表,在已知的结点*p后插入一个新结点的时间复杂度为O
(1),在给定值为x的结点后插入一个新结点的时间复杂度为O(n)
根据线性表的链式存储结构中每一个结点包含的指针个数,将线性链表分为单链表和多重链表;
根据指针的连接方式,链表又可分为动态链表和静态链表。
链表的头结点的作用:
1.标识作用2.使操作统一3.其数据域可写入链表长度,或作监视哨。
静态链表中指针表示的是下一个元素地址
静态链表能容纳的元素个数的最大数在表定义时就确定了,以后不能增加。
静态链表与动态链表在元素的插入、删除上类似,不需做元素的移动。
线性表是线性结构的基本形式
线性表的逻辑结构
线性表的定义
线性结构的特点是数据元素之间是一种线性关系,数据元素“一个接一个的排列”。
线性表是具有相同数据类型的n(n>
=0)个数据元素的有限序列,记为:
(a1,a2,…ai-1,ai,ai+1,…an);
其中:
n为表长,n=0时称为空表。
表中相邻元素之间存在顺序关系:
ai-1称为ai的直接前趋,ai+1称为ai的直接后继。
a1,…an-1有且仅有一个直接后继;
(非空线性表)
a2,…an有且仅有一个直接前趋。
(非空线性表)
线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称其为顺序表。
存储的特点:
物理上的相邻实现了逻辑相邻的表示。
顺序存储能随机访问第i个元素:
设a1的存储地址为Loc(a1),每个数据元素占d个存储地址,则第i个数据元素的地址为:
Loc(ai)=Loc(a1)+(i-1)*d1≤I≤n
顺序表插入运算时间主要消耗:
数据的移动。
一般情况下,在第i(1<
=i<
=n)个元素之前插入一个元素时,需将第n至第i(共n-i+1)个元素向后移动一个位置。
(在第i个位置上插入x,从ai到an都要向下移动一个位置,共需要移动n-i+1个元素。
)
一般情况下,删除第i(1<
=n)个元素时,需从第i+1至第n(共n-i)个元素向前移动一个位置
i的取值范围为:
1≤i≤n+1(即有n+1个位置可以插入)。
设在第i个位置上作插入的概率为Pi:
在等概率情况下:
Pi=1/(n+1),则平均移动数据元素的次数则为:
这说明:
在顺序表上做插入操作需移动表中一半的数据元素。
显然顺序表上插入时间复杂度为O(n)。
intSeqlistInsert(A[],n,i,x)
{
if(i<
1||i>
n)//检查插入位置的正确性
Printf(“参数非法”);
return0;
//插入位置参数错,返回错误代码0
}
else
for(k=n;
k>
=i;
k--)
A[k-1]<
=A[k];
//结点移动
A[i]<
=x;
//新元素插入
n<
=n+1;
//n指向新的最后元素
returnn;
//插入成功,返回成功代码
线性表的删除运算是指将表中第i个元素从线性表中去掉。
SeqlistDelete(A[],n,i)
1ORi>
n)//检查空表及删除位置的合法性
//不存在第i个元素,返回错误代码0
for(k=i+1;
k<
n;
k++)
//数据元素向前移动
=n-1;
//删除成功,返回成功代码
删除算法的时间性能分析
与插入运算相同,其时间主要消耗在了移动元素上。
计算数据移动的次数:
某次删除数据的移动次数与具体位置有关。
求平均性能。
删除第i个元素时,其后面的元素ai+1~an都要向上移动一个位置,共移动了n-i个元素。
1≤i≤n(即有n个位置可以删除)。
设在第i个位置上作删除的概率为Pi,平均移动数据元素的次数:
Pi=1/n,则平均移动数据元素的次数则为:
这说明顺序表上作删除运算时大约需要移动表中一半的元素。
显然该算法的时间复杂度为O(n)。
线性表链式存储结构,不要求逻辑上相邻的两个数据元素物理上也相邻,因此不需要用地址连续的存储单元来实现。
链表是通过一组任意的存储单元来存储线性表中的数据元素的,对每个数据元素ai,除了存放数据元素的自身的信息ai之外,还需要和ai一起存放其后继ai+1所在的存贮单元的地址,这两部分信息组成一个“结点”。
存放数据元素信息的称为数据域,存放其后继地址的称为指针域。
链表的表示:
链表是由一个个结点构成的。
结点的申请:
p=newLNode;
结点的释放:
deletep;
在某结点后面插入新结点:
设p指向单链表中某结点,s指向待插入的值为x的新结点,将*s插入到*p的后面。
操作如下:
①s->
next=p->
next;
②p->
next=s;
注意:
两个指针的操作顺序不能交换。
在某结点前面插入新结点:
设p指向链表中某结点,s指向待插入的值为x的新结点,将*s插入到*p的前面。
与后插不同的是:
首先要找到*p的前驱*q,然后再完成在*q之后插入*s。
设单链表头指针为L,操作如下:
q=L;
while(q->
next!
=p)
q=q->
//找*p的直接前驱
s->
next=q->
q->
删除结点:
设p指向单链表中某结点,删除*p。
作业1:
线性表中元素为整型,以50为界,小于50在左,大于50在右。
作业讲解:
x<
=A[i];
while(A[j]>
=xandi<
j)
{
j<
=j-1;
if(A[j]<
x)
A[i]<
=A[j];
i<
=i+1;
while(A[i]<
xandx<
j)
i<
if(A[i]>
=x)
A[j]<
j<
插入a1:
*p=a1;
改为:
p->
date=a1;
指针p指向对象date=a1,该对象是一个结构体,指向结构体里a1那部分删除a1并把存储空间解放:
free(p);
二、链表的构造
q<
=NULL;
for(j=n;
i>
=1;
i--)
p<
=(NODE*)malloc(sizeof(NODE));
date<
=an;
将an替换为ai注:
i此处为n-1
next<
把指针设为空指针,替换为q
=p;
考虑链表的头指针
当ai未插入时:
CreatLinkList(n)构造链表,n为节点
for(i=n;
scanf(ai);
=ai;
=q;
return(p);
注:
此时p、q一样∵已被赋值给对方
作业4:
倒过来。
从前节点到后节点。
头指针headp<
=head;
从头指针出发,依次输出节点。
可用for循环或while循环(不确定循环次数时用)
while(p=\NULL)
printf(p->
data);
=p->
三、链表的插入算法:
假定