1.链表
逻辑结构上一个挨一个的数据,在实际存储时,所在的内存地址并不连续,相反的,数据随机分布在内存中的各个位置,这种存储结构称为链式存储。这种链式存储所生成的表就是链表。
分散存储是链表最显著的特征,但为了能够保持数据元素之间的顺序关系,每个数据元素在存储的同时,都要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个数据元素,这样,这些由指针相互连接的数据,就具有了线性的关联。
2.结点
链表中常用数据元素的组成,链表中每个元素由两部分构成,一是本身存储的数据信息,称为数据域;而是指向后继的指针,称为指针域,这两部分信息组成数据元素的存储结构,称之为链表的“结点” 。n个结点通过指针域相互链接,组成一个链表。
链表中第一个元素所在的结点称为首元结点。而有时,在首元结点之前会额外增设一个结点此节点的数据域一般不存放数据,但有些情况下也可以存放链表的长度等信息,此结点被称为头结点,若头结点的指针域为空(NULL),表明此链表是空表。
头结点对于链表来说不是必须的,但在处理某些链表时给链表添加头结点会使问题变得更加简单,链表的头指针永远指向链表中第一个结点的位置,即如果链表有头结点,头指针就指向头结点,否则指向首元结点。
3.头结点与头指针
头指针是一个指针,指向链表的头结点或者首元结点。
头结点是一个结点,它包含数据域和指针域。
两者在程序中的直接体现就是,头指针只声明而没有分配存储空间,头结点进行了声明并分配了一个结点大小的实际物理内存。此外,链表中可以没有头结点,但不能没有头指针。
4.增删改查
删除链表的元素只需要把前结点的指针域,越过要删除的结点直接指向下一个结点,然后释放Q结点的空间(即free(Q)),
添加结点需要先确定要添加的位置,然后把前结点的指针域指向自身,再将自身的指针域指向下一个结点即可。
5.数组,链表
数组在插入和删除元素时,其后的所有元素都要被移动,链表中插入或者删除某结点时,只需要修改结点即可,不需要移动结点,效率高于数组;但从访问效率来说,数组的内存是连续的,可以直接使用下标访问数组中的某个元素,而链表的内存不连续,要访问链表中的某个结点,必须从头结点开始查找。