数据结构实用课件第一章PPT资料.ppt
- 文档编号:14648181
- 上传时间:2022-10-23
- 格式:PPT
- 页数:68
- 大小:522KB
数据结构实用课件第一章PPT资料.ppt
《数据结构实用课件第一章PPT资料.ppt》由会员分享,可在线阅读,更多相关《数据结构实用课件第一章PPT资料.ppt(68页珍藏版)》请在冰豆网上搜索。
均匀性,有序性(线性序列关系),2.1线性表的类型定义,1.线性表3)线性表的长度及空表线性表中数据元素的个数n(n0)定义为线性表的长度当线性表的长度为0时,称为空表。
ai是第i个数据元素,称i为ai在线性表中的位序。
2.线性表的基本操作p19p20,1)InitList(&
L)初始化,构造一个空的线性表2)ListLength(L)求长度,返回线性表中数据元素个数3)GetElem(L,i,&
e)取表L中第i个数据元素赋值给e4)LocateElem(L,e)按值查找,若表中存在一个或多个值为e的结点,返回第一个找到的数据元素的位序,否则返回一个特殊值。
5)ListInsert(&
L,i,e)在L中第i个位置前插入新的数据元素e,表长加1。
6)ListDelete(&
L,i,e)删除表中第i个数据元素,e返回其值,表长减1。
线性表的基本操作举例,例2-1求A=ABP20算法2.1时间复杂度:
LocateElem()执行次数O(ListLength(A)*ListLength(B)例2-2合并LA和LB到LC中P20-21算法2.2时间复杂度:
ListInsert()执行次数O(ListLength(LA)+ListLength(LB),2.2线性表的顺序表示和实现1.顺序表线性表的顺序存储结构,1)在计算机内存中用一组地址连续的存储单元依次存储线性表中的各个数据元素。
2)假设线性表的每个元素需占用L个存储单元,并以所占的第一个单元的存储地址作为数据元素的起始存储位置,则线性表中第i+1个数据元素的存储位置Loc(ai+1)和第i个数据元素的存储位置Loc(ai)之间满足下列关系:
Loc(ai+1)=Loc(ai)+L一般来说,线性表的第i个元素ai的存储位置为:
Loc(ai)=Loc(a1)+(i-1)*L其中Loc(a1)是线性表的第一个数据元素a1的存储位置,通常称作线性表的起始位置或基地址。
1.顺序表线性表的顺序存储结构,3)线性表的顺序存储结构示意图p22图2.2用“物理位置”相邻来表示线性表中数据元素之间的逻辑关系。
根据线性表的顺序存储结构的特点,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以,线性表的顺序存储结构是一种随机存取的存储结构。
#defineLIST_MAX_LENTH100/或者N/或者是一个常数typedefstructElemTypeint*elem;
intlength;
SqList;
SqListL;
2.顺序存储线性表的描述,C语言中静态分配描述p22,求置空表StatusClearList(,2.顺序存储线性表的描述,C语言中静态分配描述p22,求长度StatusListlength(SqListL)length=L.length;
returnOK;
2.顺序存储线性表的描述,C语言中静态分配描述p22,初始化StatusInitList_SqList(SqListL)L.elem=(*int)malloc(LIST_MAX_LENGTH*sizeof(int);
if(!
L.elem)exit(Overflow);
L.length=0;
2.顺序存储线性表的描述,C语言中静态分配描述p22,2.顺序表的描述1)C语言中动态分配描述p22,#defineLIST_INIT_SIZE100#defineLISTINCREMENT10typedefstructElemType*elem;
intlistsize;
说明:
elem数组指针指向线性表的基地址;
length指示线性表的当前长度;
listsize指示顺序表当前分配的存储空间大小。
当空间不足时,再分配的存储空间增量为LISTINCREMENT*sizeof(ElemType),2)几个基本操作初始化,p23算法2.3StatusInitList_SqList(SqList,插入p24算法2.4,StatusListInsert_sq(SqList需将第n(即L.length)至第i个元素向后移动一个位置。
注意:
C语言中数组下标从0开始,则表中第i个数据元素是L.elemi-1。
插入p24算法2.4,函数realloc的格式及功能格式:
void*realloc(void*p,unsignedsize)功能:
将p所指向的已分配内存区域的大小改为size。
size可以比原来分配的空间大或小。
插入(续),q=,删除p24p25算法2.5,StatusListDelete_sq(SqListreturnOK需将第i+1至第L.length个元素向前移动一个位置,插入和删除算法时间分析,用“移动结点的次数”来衡量时间复杂度。
与表长及插入位置有关。
插入:
最坏:
i=1,移动次数为n最好:
i=表长+1,移动次数为0平均:
等概率情况下,平均移动次数n/2删除:
i=1,移动次数为n-1最好:
i=表长,移动次数为0平均:
等概率情况下,平均移动次数(n-1)/2,查找,p25p26算法2.6intLocateElem_Sq(SqListL,ElemTypee)i=1;
while(i=L.length,查找的另一种描述,i=1;
p=L.elem;
while(i=L.length,合并P26算法2.7的另外一种描述,voidMergeList_Sq(SqListLa,SqListLb,SqList,合并P26算法2.7,voidMergeList_Sq(SqListLa,SqListLb,SqList,建立,#defineLIST_INIT_SIZE100StatusCreateList_Sq(SqList,递增插入,StatusOrderInsert_Sq(SqList,递减插入,StatusDeOrderInsert_Sq(SqList,4.顺序表的分析,1)优点顺序表的结构简单顺序表的存储效率高,是紧凑结构顺序表是一个随机存储结构(直接存取结构)2)缺点在顺序表中进行插入和删除操作时,需要移动数据元素,算法效率较低。
对长度变化较大的线性表,或者要预先分配较大空间或者要经常扩充线性表,给操作带来不方便。
原因:
数组的静态特性造成,作业,2.1编写程序,建立并显示一个有10个数据元素的顺序线性表。
2.2实现顺序线性表的插入、查找、删除等算法。
顺序表之整体概念:
elem,0,1,length-1,listsize,length,数组下标,内存状态,变量,操作算法,listsize-1,初始化操作,插入操作,删除操作,查找操作,排序操作,.,.,.,.,空闲,表区,elem,顺序表之整体概念:
顺序表有下列缺点:
(1)插入、删除操作时需要移动大量元素,效率较低;
(2)最大表长难以估计,太大了浪费空间,太小了容易溢出。
因此,在插入和删除操作是经常性操作的应用场合选用顺序存储结构不太合适,此时可以选用链式存储结构,数据元素之间的逻辑关系由结点中的指针来指示。
2.3线性表的链式表示和实现1.线性链表,特点:
在内存中用一组任意的存储单元来存储线性表的数据元素,用每个数据元素所带的指针来确定其后继元素的存储位置。
这两部分信息组成数据元素的存储映像,称作结点。
结点:
数据域+指针域(链域)链式存储结构:
n个结点链接成一个链表线性链表(单链表):
链表的每个结点只包含一个指针域。
data,next,单链表(SinglyLinkedList),first头指针last尾指针,指针为空单链表由头指针唯一确定,因此常用头指针的名字来命名。
如表first.,单链表的存储映像,1)线性链表的描述p28,typedefstructLNodeElemTypedata;
StructLNode*next;
LNode,*LinkList;
LinkListL;
/L是LinkList类型的变量,表示单链表的头指针,2)术语,头指针:
指向链表中第一个结点第一个数据元素结点(开始结点)头结点:
有时在单链表的第一个数据元素结点之前附设一个结点,称之头结点。
头结点的next域指向链表中的第一个数据元素结点。
对于头结点数据域的处理:
a.加特殊信息b.置空c.如数据域为整型,则在该处存放链表长度信息。
3)带头结点的单链表示意图p28图2.7,由于开始结点的位置被存放在头结点的指针域中,所以对链表第一个位置的操作同其他位置一样,无须特殊处理。
无论链表是否为空,其头指针是指向头结点的非空指针,因此对空表与非空表的处理也就统一了,简化了链表操作的实现。
非空表空表,2.基本操作,1)取元素p29算法2.82)插入元素p30算法2.93)删除元素p30算法2.104)建立链表p30p31算法2.115)有序链表的合并p31算法2.126)查找(按值查找)7)求长度8)集合的并运算,取元素(按序号查找)p29算法2.8从链表的头指针出发,顺链域next逐个结点往下搜索,直至找到第i个结点为止(j=i),StatusGetElem_L(LinkListL,inti,ElemType,插入元素p30算法2.9在第i个元素之前插入,先找到第i-1个结点,StatusListInsert_L(LinkList,e,s,P-next=s,
(2),(3),p,s-next=p-next,a,
(1),b,在带表头结点的单链表第一个结点前插入新结点,newnodenext=pnext;
if(pnext=NULL)last=newnode;
pnext=newnode;
删除元素p30算法2.10,StatusListDelete_L(LinkList,q=pnext;
pnext=qnext;
deleteq;
if(pnext=NULL)last=p;
从带表头结点的单链表中删除第一个结点,建立链表(头插法建表)p31算法2.11在链表表头插入新结点,结点次序与输入次序相反。
voidCreateList_L(LinkList尾插法建表:
将新结点插到链表尾部,须增设一个尾指针last,使其始终指向当前链表的尾结点。
合并有序链表p31算法2.12,voidMergeList_L(LinkListLa,LinkListLb,LinkList,查找(按值查找),intLinkLocate_L(LinkListL,intx)inti;
LinkListp;
p=L-next;
i=1;
while(p!
=NULL,求长度,intLinkLength_L(LinkListL)intj;
j=0;
while(p)p=p-next;
j+;
return(j);
p=NULL与p-next=NULL是不同的。
总结:
带头结点:
链表置空L-next=NU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实用 课件 第一章