贵州民族学院数据结构课件 第三章.pptVIP

  • 2
  • 0
  • 约1.27万字
  • 约 76页
  • 2019-05-06 发布于广东
  • 举报
第一部分 线性结构 第三章 链 表 第三章 链表 (linked list) 为什么要使用链式存储结构 顺序表的优点: 无须为表示结点间的逻辑关系而增加额外的存储空间 可以方便地随机存取表中的任一结点 第三章 链表 (linked list) 顺序表的缺点: 移动结点:做插入和删除运算时,除表尾的位置外,在表的其它位置上进行插入和删除操作都必须大量移动结点,其效率较低 静态分配:由于顺序表要求占用连续的存储空间,存储分配只能预先进行,因此当表大小变化频繁时,难以确定合适的存储规模 若按可能达到的最大长度分配表的空间,则可能造成一部分空间长期闲置而得不到充分利用 若事先对表长估计不足,则插入操作可能使表长超过预先分配的空间而造成溢出 第三章 链表 (linked list) 链式结构可克服上述不足,适用于频繁进行插入删除、空间大小不能预先确定的线性表 链式结构不仅只适用于线性结构,它也适用于非线性结构 本章讨论线性表的链式结构有单链表、双链表、循环链表、对称表等,统称为链表 第三章 链表 (linked list) 3.1 链表的基本概念 3.2 单链表 3.3 栈和队列的链式存储 3.4 线性表的其他链式存储 3.1 链表的基本概念 3. 结点的组成 链表的结点由两部分组成: 数据域:表示结点本身的值 指针域(链域):表示本结点与其它结点关系,指向其后继 通过链域,可将n个结点按其逻辑顺序链接在一起(不论其物理次序如何) 3.2 单链表 3.2 单链表 空表:头指针为空,例如 head=nil 单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。例如:若头指针为head,则可把该链表称为“表head” 3.2 单链表 typedef struct LNode //结点类型定义 { ElmType data; //数据域 struct LNode *link; //指针域,指向该结点的后继 } LNode, *Linklist //指针类型说明 3.2 单链表 指针p与其指向的结点的关系示意图: 说明: P是指向链表中某一结点的指针 *p 表示由指针p所指向的结点 (*p).data或p-data 表示由p所指向结点的数据域 (*p).link或p-link 表示由p所指向结点的指针域 3.2 单链表 动态生成结点: p= (Linklist) malloc ( sizeof (LNode) ) 对指针p赋值使其指向某一结点(按需要生成一个LNode 结点类型的新结点) 其中: (Linklist):进行类型转换 sizeof(LNode):求结点需用占用的字节数 malloc(size):在内存中分配size个连续可用字节的空间 free(p) 系统回收p结点(动态) 3.单链表的基本运算 (1)查找 ①按序号查找 在单链表L中找第i个结点,用指针p返回其地址 思想:从第一个结点开始,沿链域顺序找到第i个结点 算法描述 已知单链表L,现需查找L的第i个元素。假设用p返回查找结果:当p为空时表示没找到,否则p为所查结点的地址 算法LF[查找单链表L的第i个元素] LF1[置初值] p←L,j←1 LF2[找完否] 若ji ,则执行LF3,否则执行 LF4 LF3[查找]若p= nil ,则执行LF4,否则p←(*p). link ,j←j+1 , 重复执行LF2 LF4[结束]算法结束,*p为所求 C函数 已知单链表L,现需查找L的第i个元素。假设用p返回查找结果:当p为空时表示没找到,否则p 为所查结点的地址 void LFind( Linklist L, int i, Linklist p) { p=L; for(j=1; ji; j++){ if(!p) p=p-link; else break; } ②按值查找 在链表中,查找是否其值等于给定值key的结点,若有的话,则返回首次找到的值为key的结点的存储位置;否则返回nil 算法思想: 从开始结点出发,顺链域逐个结点数据域中值和给定值key作比较 算法思想:取一新结点,其数据域送值x,再修改有关结点的链域(假设用p指向第i个结点,s指向新结点): 把结点*p的后继结点作为结点*s的直接后继,结点*s作为结点*p的后继 3.单链表的基本运算 (2)插入 在单链表L的第i个结点后插入结点x 当i=0时插入在表头 先找到第i个结点的前趋结点*q,然后在*q后插入 3.单

文档评论(0)

1亿VIP精品文档

相关文档