第六单元基本数据结构.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六单元基本数据结构

第六单元 基本数据结构 数据结构就是数据之间的结构或关系。主要研究数据之间的关系的。 有一个必须要知道的等式:程序设计=算法+数据结构。合理的组织数据,才能让算法更高效的运行起来。 数据结构是为算法服务的,所有的题目,必须要先知道算法,再根据算法,选择相应的数据结构。也就是说:算法主要对数据进行各种操作,而操作之前,数据之间的关系必须建立起来。 线性表是最基本的数据结构,每一个元素只有一个前驱和一个后继,表中的元素与元素之间类似于一条线,叫线性表。线性表有两种结构,一种是顺序结构,就是我们用的数组,一种是链式结构。 6.1 线性表(顺序结构) 线性表是最基本的数据结构,可以用普通的一维数组存储。 你可以让线性表可以完成以下操作(代码实现很简单,这里不再赘述): 返回元素个数。也就是数组中有多少个元素。 判断线性表是否为空。 得到位置为p的元素。 查找某个元素。 插入、删除某个元素:务必谨慎使用,因为它们涉及大量元素的移动。 操作4和5的时间复杂度都是O(n)的。 6.2 线性表(链式结构) 链表(Linked list)是一种常见的数据结构,是动态数据结构的最基本形式。链式结构这里引用的是指针写法,指针作为编程语言必学的部分,是必须要学习的,建议有兴趣的人自行百度。我们这里给出指针写法的链式结构线性表的基本写法,仅作了解,竞赛中我们用静态链表的写法,这样的写法在比赛中,更容易调试,更容易避免低级失误。具体图例和详细讲解会在静态链表里阐述。 (1) 单链表!(作为了解,不需要代码实现。) 定义:下面有一个空链表,表头叫head,并且表内没有任何元素。 struct node { int value; node *next; } arr[MAX]; int top=-1; node *head = NULL; 内存分配:在竞赛中不要用new,也不要用malloc、calloc——像下面一样做吧。 #define NEW(p) p=arr[++top];p-value=0;p-next=NULL node *p; NEW(head); // 初始化表头 NEW(p); // 新建结点 插入:把q插入到p的后面。时间复杂度O(1)。 if (p!=NULL q!=NULL) // 先判定是否为空指针。如果不是,继续。 { q-next=p-next; p-next=q; } 删除:把p的下一元素删除。时间复杂度O(1)。 if (p!=NULL p-next!=NULL) // 先判定是否为空指针。如果不是,继续。 { node *q=p-next; p-next=q-next; // delete(q); // 如果使用动态内存分配,最好将它的空间释放。 } 查找或遍历:时间复杂度O(n)。 node *p=first; while (p!=NULL) { // 处理value // coutp-value\t; p=p-next; } (2) 静态链表(必须掌握,图的邻接表) 链表在信息学竞赛中的应用相当广泛,这是因为使用链表可以克服数组需要预先知道数据大小的缺点,充分利用计算机内存空间,实现灵活的内存动态管理。用数组模拟链表,可以简化链表的操作,从而使链表更好的为我们服务。 指针的作用就是存储地址。如果我们找到了替代品,就可以放弃指针了。而我们的替代品就是用数组的下标来代替存储地址。 单向链表是链表中最简单的一种,一个单向链表的结点包含两个域:一个信息域和一个指针域。第一个部分保存或者显示关于结点的信息,第二个部分存储下一个结点的地址。另外,一个特殊的头指针指向链表的第一个元素,并且在最后一个结点保存一个特殊的结束标记。这种最为普通的,每个结点只有一个指针的链表叫单向链表,或者单链表,通常用在每次都只会按顺序遍历这个链表的时候(例如图的邻接表等)。 我们使用链表主要是要发挥链表动态分配内存空间的优势,但是在信息学竞赛中,我们基本上不需要过多考虑动态空间分配,所以,使用数组模拟链表就可以很好的实现链表数据结构。 数组模拟链表,是一种半静态链表,是链表的线性存储。一个链表可以用一对数组或一个记录数组表示(上面的定义是以记录数组为例的)。链表中的每个结点,也就是数组中的每个元素,都是一个记录,它像链表一样也有两个数据域:信息域和指针域,分别保存该元素信息value和下一个结点在数组中的位置next(整型)。另外,我们需要一个特殊的头指针指向第一个元素,即记录第一个元素在数组中的位置(整型);类似地,可以将最后一个结点的next记为-1作为结束标记。这样插入,删除,遍历等,都可以归结到数组操作了,这就比链式存储容易多了,却不会丧失链表快速插入删除的优势。 我们先看一下

文档评论(0)

hhuiws1482 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档