数据结构第二章.docx

上传人:b****6 文档编号:16735698 上传时间:2023-07-16 格式:DOCX 页数:16 大小:616.10KB
下载 相关 举报
数据结构第二章.docx_第1页
第1页 / 共16页
数据结构第二章.docx_第2页
第2页 / 共16页
数据结构第二章.docx_第3页
第3页 / 共16页
数据结构第二章.docx_第4页
第4页 / 共16页
数据结构第二章.docx_第5页
第5页 / 共16页
数据结构第二章.docx_第6页
第6页 / 共16页
数据结构第二章.docx_第7页
第7页 / 共16页
数据结构第二章.docx_第8页
第8页 / 共16页
数据结构第二章.docx_第9页
第9页 / 共16页
数据结构第二章.docx_第10页
第10页 / 共16页
数据结构第二章.docx_第11页
第11页 / 共16页
数据结构第二章.docx_第12页
第12页 / 共16页
数据结构第二章.docx_第13页
第13页 / 共16页
数据结构第二章.docx_第14页
第14页 / 共16页
数据结构第二章.docx_第15页
第15页 / 共16页
数据结构第二章.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构第二章.docx

《数据结构第二章.docx》由会员分享,可在线阅读,更多相关《数据结构第二章.docx(16页珍藏版)》请在冰点文库上搜索。

数据结构第二章.docx

数据结构第二章

第二章线性表(LinearList)

|逻辑结构及其基本操作

|线性表的顺序存储结构

|线性表的链式存储结构

|静态链表

|应用实例

逻辑结构及其基本操作

|定义:

由n个相同类型数据元素a0a1…ai…an-1构成的有限序列。

z说明:

ai是抽去现实意义的抽象表示符号。

typedefintDataType;

typedefcharDataType;

typedefstructstudentDataType;

|基本操作

初始化:

Initiate(L)

求长度:

ListLength(L)

前插:

ListInsert(L,i,x)

删除:

ListDelete(L,i,x)

取元素:

ListGet(L,i,x)

注:

L为线性表

|顺序存储结构:

用一组地址连续的存储单元依次存储线性表的各个元素。

线性表的定义:

#defineMaxSize1024//假定线性表的最大长度为1024

typedefintDataType;/*定义数据类型*/

typedefstruct

{

DataTypeList[MaxSize];

intsize;

}SeqList;

注意:

这样定义不能对size进行初始化,因此一定要在使用前进行初始化赋值。

 

|线性表元素的插入

 

|线性表元素的删除

小结:

很显然,顺序表的插入和删除一个元素时,其时间主要花费在移动数据元素上。

算法的代价分析:

插入删除

平均移动结点的次数:

同理可得:

E=E=

假设结点插入的概率相同,即 

Pi=

把Pi代入E的计算公式中,则有:

E=

所以,在顺序表上插入和删除一个元素的时间复杂度是:

O(n)。

对于取元素和定位操作可以直接实现。

|例:

利用线性表的基本运算实现清除L中多余的重复节点。

|顺序表的优点:

简单、常用。

无须为表示节点间的逻辑关系而增加额外的存储空间

可以方便的随机存取表中的任一节点

|顺序表的缺点

插入和删除运算时,需移动大量数据,运行速度受到影响。

需预先确定数据元素最大个数。

 

|线性表的链式存储

|链表(LinkedList):

一种物理存储上非连续、非顺序的线性存储结构,数据元素间的逻辑顺序是通过链表中的指针链接次序实现的。

|节点构成:

数据域+指针域

|单链表结点的定义

typedefstructNode

{DataTypedata;

structNode*next;

}SLNode;

|单链表的结点结构的定义

(1)一般形式的单链表存储结构的结点定义方法

typedefstructNode

{

DataTypeData;

structNode*Next

}SLNode;

 

|

typedefintdatatype;

typedefstruct{

charname[10];

intage;

}DataType;

节点存储空间的申请

p=(SLNode*)malloc(sizeof(SLNode));

节点存储空间的释放

free(p);

|单链表中的基本操作——初始化

intListInitiate(SLNode**head)

{

if((*head=(SLNode*)malloc(sizeof(SLNode)))

==NULL)

return0;

用头指针建立了一个空表。

(*head)->Next=NULL;

return1;

}

|单链表中的基本操作——前插

在单链表h中的第i个元素之前插入一个数据元素x。

intListInsert(SLNode*head,inti,DataTypex)

{

SLNode*p,*q;

intj;

p=h;

j=0;

while(p!

=NULL&&j

{

p=p->Next;

j++;

}

if(j!

=i-1)

{

printf(“\n插入位置不合理!

”);

return0;

}

/*申请一空结点*/

if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)return0;

q->Data=x;/*给数据赋值*/

q->Next=p->Next;

p->Next=s;

return1;

}

|单链表中的基本操作——删除

在单链表h中删除第i个结点。

|单链表中的基本操作——取元素

在单链表h中寻找第i个结点,并返回该结点的数据元素。

|单链表中的操作举例

假设已有单链表la,复制一个具有同样结构的单链表lb。

 

|循环单链表

循环单链表的定义:

循环单链表是单链表的另一种形式,其特点是链表中最后一个结点的指针不再是空的,而是指向头结点或第一个结点,整个链表形成一个环。

从表中任一个结点出发,都可找到表中其它结点。

|双向链表

双向链表的定义:

具有两个方向的指针域的链表叫双向链表,这两个指针域分别指向当前结点的前驱和后继。

单链表只能从表头开始沿一个方向查找;而双向链表可以从任一个结点出发,向前或向后查找。

|双向链表结点的结构定义

typedefstructNode

{

DataTypeData;

structNode*Prior,*Next;

}DLNode;

 

 

双向链表前插操作的C语言算法P-49

|双链表中的基本操作——删除

双向链表删除操作的C语言算法p-50

|链式存储结构的特点

链式存储结构的优点

(1)结点空间的动态申请和动态释放;

(2)数据元素的逻辑次序用结点的指针域指示,插入、删除等操作中不需要大量移动数据。

链式存储结构的缺点

(1)每个结点中的指针域需额外占用存储空间;

(2)链式存储结构是一种非随机存储结构。

 

|应用实例

|以单链表存储结构实现线性表的就地逆转

 

|一元多项式的相加(合并同类项)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2