网站大量收购独家精品文档,联系QQ:2885784924

数据结构课件2.ppt

  1. 1、本文档共205页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 线性表 出错处理? 输出信息 跳出 返回出错信息 假设有一个足够大的连续的存储空间,可以将元素按其逻辑次序依次存储到该空间中。 顺序存储方式——顺序表 特点: 线性表中数据元素类型一致,只有数据域,存储空间利用率高。 做插入、删除时需移动大量元素。 空间估计不明时,按最大空间分配。 实现: 逻辑上相邻—物理地址相邻 随机存取 顺序存储结构的优缺点 优点 逻辑相邻,物理相邻 可随机存取任一元素 存储空间使用紧凑 缺点 插入、删除操作需要移动大量的元素 预先分配空间需按最大空间分配,利用不充分 表容量难以扩充 以元素(数据元素的映象) + 指针(指示后继元素存储位置) = 结点 (表示数据元素 或 数据元素的映象) 以“结点的序列”表示线性表 ?? 称作链表 静态链表 静态变量——在程序运行过程中一直存在 的变量 问题: 程序通用性 —— 要足够大 空间利用率 —— 低 动态链表 指针 动态变量——在程序运行过程中产生和释放的变量 【设计思路】 首先初始化单链表,而后根据结点输入的次序与其在线性表中的逻辑次序是否一致(正序)或相反(逆序),决定是采用尾插法还是头插法,逐个将各结点依次插入到单链表中。 1)头插法 思想:每次将待插结点*s插入到第一个结点之前;当有头结点时,待插结点也可视为插入到第0个结点(头结点)之后。 插入步骤:以单链表中有头结点为例,单个结点的构造和插入步骤如下 ① p = (LinkList)malloc(sizeof(LNode)) ② scanf(s-data) ③ p-next = L-next ④ L-next = p 算法分析:由上可看出每次插入一个结点所需的时间为O(1) ∴头插法创建单链表的时间复杂度 T(n) = O(n) 2)尾插法 思想:待插结点*s插入到最后一个结点之后 插入步骤: ① 获得最后一个结点的位置,使p指向该结点 ② p-next = (LinkList)malloc( sizeof(LNode)) ③ p = p-next ④ scanf( p-data ) ⑤ p-next = NULL 算法分析:要想获取最后一个结点的位置,必须从链头指针开始顺着next链搜索链表的全部结点,该过程的时间复杂度是 O(n)。如果每次插入都按此方法获取最后一个结点的位置,则整个创建算法的时间复杂度为T(n) = O(n2 ) 。 考虑到在尾插法创建链表时,上次插入的结点即是作为下一次待插结点的直接前驱,因此可以引入一个指针变量p记录当前最后一个结点的位置。由于初始时链表为空表,当有头结点时最后一个结点即为该头结点,故初始时可在O(1)时间获得最后一个结点的位置;以后利用上述的③可以调整p的值使其指向当前最后一个结点。这样,尾插法创建链表的时间复杂度为T(n) = O( n )。 p-next = (LinkList )malloc(sizeof(LNode)); if ( p-next == NULL ) exit(OVERFLOW); p = p-next; p-data = e; }else bCycleFlag = 0; //设置循环插入结束 } p-next = NULL; return OK; } 在与链表有关的算法设计中,遍历链表是最基本的也是最为典型的算法。 所谓遍历是指按某种次序访问链表中所有结点一次,并且仅一次。 例:单链表的遍历:设计算法依次打印链表中所有结点的值。(假设无头结点) Void print(L) { p=L; While ( p!=null) { printf(“%d”,p-data); p=p-next;} } (1)单链表的初始化 int lbcr(LinkList *h) { if ((*h=(LinkList )malloc(sizeof(LNode )))==NULL) return FALSE; (*h)-next = NULL; return TRUE; } (2)单链表的查找——查找单链表中是否存在结点X,若有则返回指向X结点的指针;否则返回NULL。 LinkList *dlbcz(LinkList *L, int x ) { LinkList *p; p=L; while(p!=NULL p-data!=X) p=p-next; r

您可能关注的文档

文档评论(0)

kxiachiq + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档