1、链表
1.1链表的基本介绍
链表是以节点的方式来存储,是链式存储,从图中发现,链表的各个节点不一定是连续存储
每个节点包含data域:存储数据,next域:指向下一个节点
链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
没有头节点单链表:也就是phead只是一个引用(指针),指向链表的第一个节点
有头节点单链表:phead是头节点只不过头节点的data不保存信息
基本概念:链表的每个元素称为一个节点,每个节点都可以存储在内存中的不同的位置,为了表示每个元素与后继元素的逻辑关系,以便构成“一个节点链着一个节点”的链式存储结构,除了存储元素本身的信息外,还要存储其直接后继信息,因此,每个节点都包含两个部分,第一部分称为链表的数据区域,用于存储元素本身的数据信息,这里用data表示,它不局限于一个成员数据,也可是多个成员数据,第二部分是一个结构体指针,称为链表的指针域,用于存储其直接后继的节点信息,这里用next表示,next的值实际上就是下一个节点的地址,当前节点为末节点时,next的值设为空指针
1.2链表和数组的比较
数组:数组(包括结构体数组)的实质是一种线性表的顺序表示方式,它的优点是使用直观,便于快速、随机地存取线性表中的任一元素,但缺点是对其进行 插入和删除操作时需要移动大量的数组元素,同时由于数组属于静态内存分配,定义数组时必须指定数组的长度,程序一旦运行,其长度就不能再改变,实际使用个数不能超过数组元素最大长度的限制,否则就会发生下标越界的错误,低于最大长度时又会造成系统资源的浪费,因此空间效率差。
链表:链表实际上是线性表的链式存储结构,与数组不同的是,它是用一组任意的存储单元来存储线性表中的数据,存储单元不一定是连续的,且链表的长度不是固定的,链表数据的这一特点使其可以非常的方便地实现节点的插入和删除操作。链表的特性,使其在某些操作上比数组更加高效。例如当进行插入和删除操作时,链表操作的时间复杂度仅为O(1)。另外,因为链表在内存中不是连续存储的,所以可以充分利用内存中的碎片空间。除此之外,链表还是很多算法的基础,最常见的哈希表就是基于链表来实现的。
2、单向链表的具体实现
本节将具体介绍单向链表(带头结点)的结构和各种操作的具体实现
2.1单链表(带头节点)逻辑结构示意图如下
2.2单链表的应用实例(单链表实现学生成绩管理系统)
为了方便对链表各项操作的理解,把链表应用到具体的实例中:用带头节点的单链表实现学生成绩管理系统。对学生的成绩信息实现增删改查的操作,具体实现目标如下:
添加学生成绩信息
根据学号将学生信息插入到指定位置
显示所有学生的信息