目录
七、链表
7.1 链表的是什么?
7.2数组和链表的优点和缺点
7.3 链表概述
编辑
7.4 设计静态链表
7.4.1 定义一个结点(结构体)
7.4.2 使用头结点构建一个单向链表
七、链表
7.1 链表的是什么?
C++链表是一种数据结构,用于存储和组织元素的集合。它由一个节点的序列组成,每个节点包含数据和一个指向下一个节点的指针。
链表的节点包含两个重要的部分:数据和指针。数据部分存储实际的元素值,可以是任何数据类型。指针部分指向链表中下一个节点的地址,通过这种方式将节点连接在一起形成链表。
链表通常分为两种类型:单向链表和双向链表。
单向链表(Singly Linked List):每个节点只有一个指向下一个节点的指针。链表的第一个节点称为头节点,最后一个节点称为尾节点,尾节点的指针通常为NULL。
双向链表(Doubly Linked List):每个节点既有一个指向下一个节点的指针,也有一个指向前一个节点的指针。这种结构使得在链表中进行前向和后向遍历变得更加方便和高效。
链表的优点是可以动态地插入和删除节点,而不需要像数组那样移动大量的元素。然而,链表的缺点是无法通过索引直接访问元素,需要通过遍历链表来寻找指定位置的节点。
在C++中,可以使用指针来实现链表。常见的链表操作包括在链表的头部插入节点、在链表的尾部插入节点、删除节点、查找节点等。
7.2数组和链表的优点和缺点
静态数组int arr[5];必须事先确定数组元素的个数,过多浪费过小容易溢出,删除插入数据效率低。(需要移动大量的数据)
动态数组:不需要事先知道元素的个数,在使用中动态申请,删除插入数据效率低。(需要移动大量的数据)
(数组优点:遍历元素效率高)
链表:不需要事先知道数据的个数,在使用中动态申请,插入删除不需要移动数据。
(链表缺点:遍历效率低)
7.3 链表概述
链表是由一个个节点组成,节点没有名字,每个节点从堆区动态申请,节点间物理上是非连续的,但是每个节点通过指针域 保存下一个节点的位置达到逻辑上连续。
不带头结点就是使用一个指针变量来保存第一个结点的地址。带头结点的就是牺牲一个空结点(数据区域不存储数据)来存储第一个结点的地址。
7.4 设计静态链表
7.4.1 定义一个结点(结构体)
struct stu{
//数据域
int num;
char name[32];
//指针域
struct stu *next;
};
7.4.2 使用头结点构建一个单向链表
struct stu node1 = {101,"Tom",nullptr};
struct stu node2 = {102,"Jery",nullptr};
struct stu node3 = {103,"Spike",nullptr};
struct stu node4 = {104,"Butch",nullptr};
struct stu node5 = {105,"Galore",nullptr};
//定义链表头结点
struct stu *head = &node1;
node1.next = &node2;
node2.next = &node3;
node3.next = &node4;
node4.next = &node5;
node5.next = nullptr;
//遍历链表
struct stu *pb = head;
while (pb != nullptr) {
//访问数据
cout<<pb->num<<" "<<pb->name<<endl;
//pb移动到下一个
pb = pb->next;
}