收藏 分享(赏)

数据结构-list.ppt

上传人:oil007 文档编号:3817419 上传时间:2018-11-19 格式:PPT 页数:66 大小:587.50KB
下载 相关 举报
数据结构-list.ppt_第1页
第1页 / 共66页
数据结构-list.ppt_第2页
第2页 / 共66页
数据结构-list.ppt_第3页
第3页 / 共66页
数据结构-list.ppt_第4页
第4页 / 共66页
数据结构-list.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

1、第2章 线性表,本章的基本内容 线性表的类型(逻辑结构) 线性表的顺序表示及实现 线性表的链式表示及实现 实例:一元多项式的表示及相加,线性表的基本概念,线性表是具有相同数据类型的n(n0)个数据元素组成的有限序列,通常记为L=(a1,a2,ai1,ai,ai+1,an),(1)有且仅有一个表头结点a1,它没有前驱,而仅有一个后继a2; (2)有且仅有一个表尾结点an,它没有后继,而仅有一个前驱an1; (3)其余的结点ai(2in1)都有且仅有一个前驱a i1和一个后继a i+1。,线性表的存储结构:顺序存储,34,23,67,43,4,例:(34, 23, 67, 43),例:(34, 2

2、3, 67, 43),34,23,67,43,4,用什么属性来描述顺序表?,顺序存储结构,例:(34, 23, 67, 43),34,23,67,43,4,顺序存储结构,如何实现顺序表的内存分配?,如何求得任意元素的存储地址?,0 i-2 i-1 n-1 Max-1,a1,ai-1,ai,an,空闲,长度,一般情况下,(a1,a2,, ai-1,ai , , an)的顺序存储:,顺序存储结构,0 i-2 i-1 n-1 Max-1,a1,ai-1,ai,an,空闲,长度,一般情况下,(a1,a2,, ai-1,ai , , an)的顺序存储:,顺序存储结构,Loc(ai)=Loc(a1) +

3、(i -1)d,随机存取:在O(1)时间内存取数据元素,线性表的动态分配顺序存储结构,#define LIST_INIT_SIZE 100 /* 线性表存储空间的初始分配量 */ #define LIST_INCREMENT 10 /* 线性表存储空间的分配增量 */typedef struct ElemType *elem; /* 存储空间基址 */int length; /* 当前长度 */int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */ SqList;,一些预定义的约定,#define TRUE 1 #define FALSE 0 #

4、define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2/Status是函数类型,其值是函数结果状态代码 typedef int Status;函数类型 函数名(函数参数表/算法说明语句序列 /函数名,线性表的初始化,初始化操作:构造一个空的顺序线性表Lvoid InitList(SqList *L) L-elem = (ElemType*) malloc (LIST_INIT_SIZE*sizeof(ElemType);if(!L-elem)exit(OVERFLOW); /* 存储分配失败 */L-lengt

5、h = 0; /* 空表长度为0 */L-listsize = LIST_INIT_SIZE; /* 初始存储容量 */ ,Status ListInsert_Sq(SqList *L,int i,ElemType e),在第i个元素之前插入新的元素 e,线性表的插入操作,插入前:(a1, , ai-1, ai, , an) 插入后:(a1, , ai-1, e , ai, , an),ai-1和ai之间的逻辑关系发生了变化,顺序存储要求存储位置反映逻辑关系,存储位置要反映这个变化,插入算法,Status ListInsert(SqList *L,int i,ElemType e) /* 操作

6、结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ElemType *newbase,*q,*p;if(iL-length + 1) /* i值不合法 */return ERROR;if(L-length = L- listsize) /* 当前存储空间已满, 增加分配 */newbase = (ElemType *)realloc(L- elem,(L- listsize+LIST_INCREMENT)*sizeof(ElemType);if(! newbase)exit (OVERFLOW); /* 存储分配失败 */L- elem = newbase; /* 新基址 */L

7、- listsize += LIST_INCREMENT; /* 增加存储容量 */q = L- elem+i-1; /* q为插入位置 */for (p = L- elem+ L-length-1; p = q; -p) /* 插入位置及之后的元素右移 */*(p+1) = *p;*q = e; /* 插入e */+ L- length; /* 表长增1 */return OK; ,插入操作算法描述 检查插入位置i是否合法,若不合法,则停止插入,并给出“插入位置非法”出错提示;否则,执行第步。检查顺序表的存储空间是否已到最大值(被占满),若是,则增加分配;否则,执行第步。 从最后一个元素向前

8、直至第i个元素(下标为i1)为止,将每一个元素均后移一个存储单元,将第i个元素的存储位置空出。 将新元素e写入到第i个元素处,即下标为i1的位置。 将顺序表长度加1。,最好情况( i=n+1):基本语句执行0次,时间复杂度为O(1)。 最坏情况( i=1):基本语句执行n+1次,时间复杂度为O(n)。 平均情况(1in+1):时间复杂度为O(n)。,插入算法时间性能分析:,插入算法分析,删除L的第i个数据元素,并用e返回其值 ListDelete_Sq (SqList *L, int i, ElemType *e) 删除前:(a1, , ai-1,ai,ai+1,an) 删除后:(a1,ai-

9、1,ai+1, ,an),ai-1和ai之间的逻辑关系发生了变化,顺序存储要求存储位置反映逻辑关系,存储位置要反映这个变化,线性表的删除操作,例:(35, 33, 12, 24, 42),删除i=2的数据元素。,5,35,a1,a2,a3,a4,0 1 2 3 4,42,24,12,33,a5,12,24,42,线性表的删除操作,线性表的删除操作,Status ListDelete_Sq(SqList *L, int i, ElemType *e) /* 初始条件:顺序线性表L已存在,1iListLength(L) */* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */E

10、lemType *p,*q;if(i L-.length) /* i值不合法 */return ERROR;p = L-elem + i-1; /* p为被删除元素的位置 */*e=*p; /* 被删除元素的值赋给e */q = L-elem + L-length-1; /* 表尾元素的位置 */for(+p; p length-; /* 表长减1 */return OK; ,顺序表的优缺点,优点: 无需为表示表中元素之间的逻辑关系而增加额外的存储空间; 随机存取:可以快速地存取表中任一位置的元素。 缺点: 插入和删除操作需要移动大量元素; 表的容量难以确定,表的容量难以扩充; 造成存储空间的

11、碎片。,线性表的链式表示和实现,单链表:线性表的链接存储结构。 存储思想:用一组任意的存储单元存放线性表的元素。,单链表的存储结构,例:(a1, a2 ,a3, a4)的存储示意图 存储特点: 逻辑次序和物理次序不一定相同。 元素之间的逻辑关系用指针表示。,a1 0200,a2 0325,a3 0300,a4,数据域,指针域,单链表是由若干结点构成的; 单链表的结点只有一个指针域。,data:存储数据元素 next:存储指向后继结点的地址,单链表的存储结构,typedef struct Lnode ElemType data;struct Lnode *next; LNode, *LinkLi

12、st;,如何申请一个结点?,单链表的存储结构,typedef struct Lnode ElemType data;struct Lnode *next; LNode, *LinkList;,单链表的存储结构,s=(LNode *) malloc (sizeof(LNode);,s=(LNode *) malloc (sizeof(LNode);,如何引用数据元素?,data,如何引用指针域?,next,s-next;,单链表的操作算法,重点在数据元素之间的逻辑关系的 表示,所以,将实际存储地址抽象。,什么是存储结构?,单链表的操作算法,头指针:指向第一个结点的地址。 尾标志:终端结点的指针域

13、为空。,单链表的操作算法,空表和非空表不统一,缺点? 如何将空表与非空表统一?,单链表的操作算法,头结点:在单链表的第一个元素结点之前附设一个类型相同的结点,以便空表和非空表处理统一。,非空表,单链表的操作算法,操作接口: Status GetElem_L (LinkList L, int i, ElemType *e);,核心操作(关键操作):工作指针后移。从头结点(或开始结点)出发,通过工作指针的反复后移而将整个单链表“审视”一遍的方法称为扫描(或遍历)。,head,a1,a2,an,ai,单链表的操作算法: 按位查找,Status GetElem_L(LinkList L,int i,E

14、lemType *e) /* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */int j = 1; /* j为计数器 */LinkList p = L-next; /* p指向第一个结点 */while(p ,单链表的操作算法: 按位查找,void VistList_L(LinkList L) LinkList p;p = L-next; /* 取第1个元素 */while (p)visit (p) ; /* 访问节点 */p = p-next; /* 取下一个*/ ,单链表的操作算法: 遍历,操作接口: Status ListInsert_L(

15、LinkList L, int i, ElemType e),如何实现结点ai-1、e和ai之间逻辑关系的变化?,算法描述: s=(LNode *)malloc(sizeof(LNode); s-data = e; s-next = p-next; p-next = s;,单链表的操作算法: 插入,注意分析边界情况表头、表尾。,head,a1,an,ai,算法描述: s=(Lnode *)malloc(sizeof(LNode); s-data = e; s-next = p-next; p-next = s;,由于单链表带头结点,表头、表中、表尾三种情况的操作语句一致。,单链表的操作算法:

16、插入,1. 工作指针p初始化;累加器j清零; 2. 查找第i-1个结点并使工作指针p指向该结点;3. 若查找不成功,说明插入位置不合理,返回插入位置异常;否则,3.1 生成一个元素值为e的新结点s;3.2 将新结点s插入到结点p之后;,单链表的操作算法: 插入,Status ListInsert_L(LinkList L, int i, ElemType e) /* 在带头结点的单链线性表L中第i个位置之前插入元素e */int j = 0;LinkList p = L, s;while(p ,单链表的操作算法: 插入,操作接口: Status ListDelete(LinkList L,in

17、t i,ElemType *e),如何实现结点ai-1和ai之间逻辑关系的变化?,算法描述: q = p-next; *e = q-data; p-next = q-next; free(q);,单链表的操作算法: 删除,算法描述: q = p-next; *e = q-data; p-next = q-next; free(q);,注意分析边界情况表头、表尾。,表尾的特殊情况: 虽然被删结点不存在,但其前驱结点却存在。,p-next=NULL,单链表的操作算法: 删除,算法描述伪代码,1.工作指针p初始化;累加器j清零;2. 查找第i-1个结点并使工作指针p指向该结点;3. 若p不存在或p不

18、存在后继结点,则抛出位置异常;否则,3.1 暂存被删结点和被删元素值;3.2 摘链,将结点p的后继结点从链表上摘下;3.3 释放被删结点;3.4 返回被删元素值;,单链表的操作算法: 删除,Status ListDelete_L(LinkList L, int i, ElemType *e) /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */int j=0;LinkList p=L, q;while(p-next ,单链表的操作算法: 删除,void CreateList_L(LinkList L, int n) /* 逆位序输入n个元素的值,建立带头节点的单链表L */i

19、nt i;LinkList p;L-next = NULL; /* 先建立带头节点的单链表 */for (i = n; i 0; - i)p=(LinkList) malloc (sizeof(LNode); /* 生成新节点 */scanf(“%d”, ,单链表的操作算法: 构造,void MergeList_L(LinkList La,LinkList Lb,LinkList Lc)/已知单链线性表La和Lb的元素按值非递减排列/归并后得到新的单链线性表Lc,元素也按值非递减排列pa =La-next, pb=Lb-next;pc=Lc=La; /* 用La的头节点作为Lc的头节点*/wh

20、ile(pa /*释放Lb的头节点*/ ,单链表的操作算法: 合并有序链表,head,a1,ai-1,an,ai,从单链表中某结点p出发如何找到其前驱?,将单链表的首尾相接,将终端结点的指针域由空指针改为指向头结点,构成单循环链表,简称循环链表。,线性表的其他存储结构,循环链表,head,a1,ai-1,an,ai,插入算法描述: s = (LinkList)mallc(sizeof(LNode); s-data = e; s-next = p-next; p-next = s;,循环链表,如何求结点p的直接前驱,时间性能?,为什么可以快速求得结点p的后继?,如何快速求得结点p的前驱?,循环链

21、表,双向链表:在单链表的每个结点中再设置一个指向其前驱结点的指针域。,结点结构:,data:数据域,存储数据元素; prior:指针域,存储该结点的前趋结点地址; next:指针域,存储该结点的后继结点地址。,双向链表,顺序表和单链表的比较,存储分配方式比较 顺序表采用顺序存储结构,即用一段地址连续的存储单元依次存储线性表的数据元素,数据元素之间的逻辑关系通过存储位置来实现。 单链表采用链接存储结构,即用一组任意的存储单元存放线性表的元素。用指针来反映数据元素之间的逻辑关系。,顺序表和单链表的比较:时间性能比较,时间性能是指实现基于某种存储结构的基本操作(即算法)的时间复杂度。 按位查找: 顺

22、序表的时间为(1),是随机存取; 单链表的时间为(n),是顺序存取。 插入和删除: 顺序表需移动表长一半的元素,时间为(n); 单链表不需要移动元素,在给出某个合适位置的指针后,插入和删除操作所需的时间仅为(1)。,顺序表和单链表的比较:空间性能比较,空间性能是指某种存储结构所占用的存储空间的大小。 定义结点的存储密度:,顺序表和单链表的比较:空间性能比较,空间性能比较 结点的存储密度: 顺序表中每个结点的存储密度为1(只存储数据元素),没有浪费空间; 单链表的每个结点的存储密度1(包括数据域和指针域),有指针的结构性开销。 整体结构: 顺序表需要预分配存储空间,如果预分配得过大,造成浪费,若

23、估计得过小,又将发生上溢; 单链表不需要预分配空间,只要有内存空间可以分配,单链表中的元素个数就没有限制。,顺序表和单链表的比较,若线性表需频繁查找却很少进行插入和删除操作,或其操作和元素在表中的位置密切相关时,宜采用顺序表作为存储结构;若线性表需频繁插入和删除时,则宜采用单链表做存储结构。 当线性表中元素个数变化较大或者未知时,最好使用单链表实现;而如果用户事先知道线性表的大致长度,使用顺序表的空间效率会更高。线性表的顺序实现和链表实现各有其优缺点,只能根据实际问题的具体需要,并对各方面的优缺点加以综合平衡,才能最终选定比较适宜的实现方法。,在计算机中,可以用一个线性表来表示:P = (p0

24、, p1, ,pn),一元多项式,但是对于形如,S(x) = 1 + 3x10000 2x20000,的多项式,上述表示方法是否合适?,一般的,一元稀疏多项式可写成Pn(x) = p1xe1 + p2xe2 + + pmxem 其中:pi 是指数为ei 的项的非零系数,0 e1 e2 em = n,可以下列线性表表示: (p1, e1), (p2, e2), , (pm,em) ),一元多项式的实现:,typedef struct / 项的表示float coef; / 系数int expn; / 指数 term, ElemType;,typedef OrderedLinkList polyn

25、omial; / 用带表头结点的有序链表表示多项式,结点的数据元素类型定义为:,一元多项式的表示及相加,设:1)多项式采用非零系数单链表结构;2)多项式A(x)和B(x)相加,“和多项式”C(x)的结点不另外申请存储空间;3)p,q分别指向A(x)和B(x)中的某结点。运算规则:指数相同,系数相加。若p-exp exp,则p结点为C(x)的一项,移动p;若p-exp q-exp,则q结点插入在p结点之前,移动q;若p-exp = q-exp,则p-coef:= p-coef+ q-coef;释放q结点; 当和为时,释放p结点; 移动p和q;,算法,int cmp(term a,term b);

26、/依a的指数值)b的指数值,分别返回-1、0和+1void AddPolyn(polynomial /qa和qb分别指向Pa和Pb中当前结点,while(!Empty(Pa)/switch/while,if(!Empty(Pb) Append(Pa,qa); /链表Pb中剩余结点FreeNode(hb); /释放Pb的头结点 /AddPolyn,一元多项式的表示及相加,例A(x) = 7 + 3x + 9x8 + 5x17 - 8x100B(x) = 8x + 22x7 - 9x8,C(x) = A(x)+ B(x) = 7 + 11x + 22x7 + 5x17- 8x100 存储方式的选择以单链表存储多项式系数和指数,一元多项式的表示及相加,一元多项式的表示及相加,一元多项式的表示及相加,一元多项式的表示及相加,一元多项式的表示及相加,一元多项式的表示及相加,一元多项式的表示及相加,

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

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报