C++ 单链表、双链表和循环链表

特性/操作 单链表 (Singly Linked List) 双链表 (Doubly Linked List) 循环链表 (Circular Linked List)
节点结构 数据 + 指向下一个节点指针 数据 + 指向前一个节点指针 + 指向下一个节点指针 数据 + 指向下一个节点指针
头指针 指向第一个节点 指向第一个节点 指向第一个节点
遍历方向 单向遍历 双向遍历 从头节点开始,循环遍历
插入操作 在头部或尾部插入 在头部或尾部插入 在尾部插入,指向头节点
删除操作 需要找到前一个节点 直接访问前后节点 需调整指针保持循环结构
内存管理 节点删除需手动管理 节点删除需手动管理 节点删除需手动管理
应用场景 动态数据存储,栈 浏览器前进后退功能,音乐播放器 游戏回合制,任务调度
优缺点 - 内存利用高
- 插入/删除简单
- 难以逆向遍历
- 支持双向遍历
- 删除操作方便
- 内存开销大
- 节省空间
- 循环结构适合循环任务
- 删除操作需注意循环

操作示例

操作 单链表例子 双链表例子 循环链表示例
插入 insert(30)
头部: 30 -> 10 -> 20
insert(30)
头部: 30 <-> 10 <-> 20
insert(30)
尾部: 10 -> 20 -> 30 -> 头
删除 remove(10)
结果: 20
remove(20)
结果: 10 <-> 30
remove(10)
结果: 20 -> 30 -> 头

一、单链表(Singly Linked List)

1. 定义

单链表是一种线性数据结构,由一系列节点构成。每个节点包含数据部分和指向下一个节点的指针,最后一个节点的指针指向 nullptr

2. 原理

  • 节点结构:每个节点包含数据和指向下一个节点的指针。
  • 头指针:链表的起始点,通过它访问其他节点。

3. 操作

  • 插入:在链表头部或尾部插入新节点。
  • 删除:根据值删除节点,需调整指针。
  • 遍历:从头节点开始,依次访问每个节点。

4. 应用场景

  • 动态数据存储(如购物车)。
  • 实现栈(后进先出)。

5. 示例代码

#include <iostream>

struct Node {
    int data;         // 节点数据
    Node* next;      // 指向下一个节点的指针
};

class SinglyLinkedList {
private:
    Node* head;      // 链表头指针

public:
    SinglyLinkedList() : head(nullptr) {} // 初始化头指针
    ~SinglyLinkedList();                    // 析构函数
    void insert(int value);                 // 插入节点
  &

C++ 链表是一种基础且重要的数据结构,在计算机科学领域应用广泛。它通过节点间的指针链接来存储数据,与数组的连续存储方式不同。 ### 链表的实现 - **单向链表**:在 C++ 中,单向链表节点通常包含数据域指向下一个节点的指针。虽然未给出单向链表节点的具体代码,但基本结构可类比双向链表节点,即一个数据域一个指向下一节点的指针。 - **双向链表**:双向链表在单向链表基础上增加了一个指向前一个节点的指针。以下是双向链表节点结构体及创建新节点函数的代码示例: ```cpp // 双向链表节点结构体 typedef struct DNode { int data; struct DNode *prev; struct DNode *next; } DNode; // 创建新节点的函数 DNode* createDNode(int data) { DNode *newNode = (DNode*)malloc(sizeof(DNode)); newNode->data = data; newNode->prev = NULL; newNode->next = NULL; return newNode; } ``` 此外,还有使用模板实现的双链表节点结构: ```cpp // 双链表节点结构 template <typename T> struct DoublyNode { T data; // 数据域 DoublyNode* prev; // 指向前驱节点 DoublyNode* next; // 指向后继节点 DoublyNode(const T& val) : data(val), prev(nullptr), next(nullptr) {} }; ``` ### 链表的应用场景 链表适用于需要频繁进行插入删除操作的场景,在内存管理、缓冲区管理、动态内存分配等方面有广泛应用。例如,操作系统中的任务调度内存管理,就经常使用链表来管理任务内存块。链表也是队列、栈哈希表等数据结构的实现基础 [^1][^5]。 ### 链表的操作技巧 在 C++ 中对链表进行操作时,如排序操作,可使用归并排序,示例代码如下: ```cpp list_head->next = MergeSort(list_head->next); for_each(pow, list_head) cout<<pow->data<<"\t"; cout<<endl; ``` 这段代码先对链表进行归并排序,然后遍历链表输出每个节点的数据 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值