目录
C++链表是一种数据结构,用于存储和组织元素的集合。它由一个节点的序列组成,每个节点包含数据和一个指向下一个节点的指针。
链表的节点包含两个重要的部分:数据和指针。数据部分存储实际的元素值,可以是任何数据类型。指针部分指向链表中下一个节点的地址,通过这种方式将节点连接在一起形成链表。
链表通常分为两种类型:单向链表和双向链表。
单向链表(Singly Linked List):每个节点只有一个指向下一个节点的指针。链表的第一个节点称为头节点,最后一个节点称为尾节点,尾节点的指针通常为NULL。
双向链表(Doubly Linked List):每个节点既有一个指向下一个节点的指针,也有一个指向前一个节点的指针。这种结构使得在链表中进行前向和后向遍历变得更加方便和高效。
链表的优点是可以动态地插入和删除节点,而不需要像数组那样移动大量的元素。然而,链表的缺点是无法通过索引直接访问元素,需要通过遍历链表来寻找指定位置的节点。
在C++中,可以使用指针来实现链表。常见的链表操作包括在链表的头部插入节点、在链表的尾部插入节点、删除节点、查找节点等。
静态数组int arr[5];必须事先确定数组元素的个数,过多浪费过小容易溢出,删除插入数据效率低。(需要移动大量的数据)
动态数组:不需要事先知道元素的个数,在使用中动态申请,删除插入数据效率低。(需要移动大量的数据)
(数组优点:遍历元素效率高)
链表:不需要事先知道数据的个数,在使用中动态申请,插入删除不需要移动数据。
(链表缺点:遍历效率低)
链表是由一个个节点组成,节点没有名字,每个节点从堆区动态申请,节点间物理上是非连续的,但是每个节点通过指针域 保存下一个节点的位置达到逻辑上连续。

不带头结点就是使用一个指针变量来保存第一个结点的地址。带头结点的就是牺牲一个空结点(数据区域不存储数据)来存储第一个结点的地址。

- struct stu{
- //数据域
- int num;
- char name[32];
- //指针域
- struct stu *next;
- };
- 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<
num<<" "<name< - //pb移动到下一个
- pb = pb->next;
- }
