数据结构>线性表>链表_结点

数据结构>线性表>链表_结点_02

(头指针->头结点->首元结点 )

数据结构>线性表>链表_数据结构与算法_03

数据结构>线性表>链表_双向链表_04

数据结构>线性表>链表_链表_05数据结构>线性表>链表_链表_06

  1. 数据结构>线性表>链表_数据结构与算法_07数据结构>线性表>链表_数据结构与算法_08
  • 单链表

 数据结构>线性表>链表_链表_09

销毁单链表

数据结构>线性表>链表_数据结构与算法_10

数据结构>线性表>链表_结点_11数据结构>线性表>链表_结点_12


tip*数据结构>线性表>链表_结点_13


  • 数据结构>线性表>链表_数据结构与算法_14
  • 数据结构>线性表>链表_数据结构与算法_15(此处,LinkList已经是指针,定义p,不需要加*)

      这里定义的是单链表中每个结点的存储结构,它包括两部分:存储结点的数据域data,其类型用通用类型标识符ElemType表示(例如,用链表表示案例2.1中的图书信息时,只需将ElemType替换为2.4.1定义的Book数据类型即可);存储后继结点位置的指针域next,其类型为指向结点的指针类型LNode*。

      为了提高程序的可读性,在此对同一结构体指针类型起了两个名称,LinkList与LNode*,两者本质上是等价的。通常习惯上用LinkList定义单链表,强调定义的是某个单链表的头指针;用LNode*定义指向单链表中任意结点的指针变量。例如,若定义LinkList L,则L为单链表的头指针,若定义LNode*p,则p为指向单链表中某个结点的指针,用*p代表该结点。当然也可以使用定义LinkList p,这种定义形式完全等价于LNode*p。

数据结构>线性表>链表_链表_16



  • 数据结构>线性表>链表_数据结构与算法_17(增删查改)
  • <1> 查找

      取第i个元素值

数据结构>线性表>链表_数据结构与算法_18

具体

数据结构>线性表>链表_数据结构与算法_19

数据结构>线性表>链表_结点_20

              按值查找

数据结构>线性表>链表_数据结构与算法_21

数据结构>线性表>链表_数据结构与算法_22数据结构>线性表>链表_双向链表_23

  • <2>插入

数据结构>线性表>链表_结点_24

不可以,会丢失ai的地址

  • <3>删除

数据结构>线性表>链表_结点_25数据结构>线性表>链表_链表_26


  • 效率分析
  • 数据结构>线性表>链表_数据结构与算法_27


  • 头插尾插建立链表数据结构>线性表>链表_数据结构与算法_28数据结构>线性表>链表_结点_29数据结构>线性表>链表_双向链表_30
  • 尾插法建立链表

数据结构>线性表>链表_双向链表_31数据结构>线性表>链表_双向链表_32

(不同的是:为了使新结点能够插入到表尾,需要增加一个尾指针r指向链表的尾结点)


数据结构>线性表>链表_数据结构与算法_33

r是尾结点,一直在尾结点



  • 循环链表

数据结构>线性表>链表_数据结构与算法_34数据结构>线性表>链表_结点_35数据结构>线性表>链表_数据结构与算法_36

(有一个尾指针更好操作链表头尾结点) 数据结构>线性表>链表_结点_37数据结构>线性表>链表_双向链表_38

  • 双向链表数据结构>线性表>链表_结点_39数据结构>线性表>链表_双向链表_40数据结构>线性表>链表_数据结构与算法_41

         双向链表插入操作思路

  • 数据结构>线性表>链表_双向链表_42
    双向链表删除操作
  • 数据结构>线性表>链表_数据结构与算法_43

数据结构>线性表>链表_结点_44


  • 链表效率比较数据结构>线性表>链表_双向链表_45
  • 顺序表,链表比较数据结构>线性表>链表_双向链表_46
  • 线性表的应用数据结构>线性表>链表_数据结构与算法_47数据结构>线性表>链表_结点_48数据结构>线性表>链表_结点_49数据结构>线性表>链表_链表_50