C++数据结构之链表的创建

C++中链表的创建一般可分为以下几个步骤:

  1. 创建节点结构体
  2. 创建链表类,定义私有变量头结点(head)和一些公有方法,如插入、删除和打印链表等
  3. 实现链表的插入、删除和打印方法

下面将会对以上每个步骤进行详细讲解。

1. 创建节点结构体

节点结构体包含两个部分,一个是存储数据的变量,另一个是存储指向下一个节点的指针。代码如下:

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

2. 创建链表类

链表类一般包括两个私有变量:头结点head和链表长度size,以及一些公有方法,如插入、删除和打印链表等。代码如下:

class LinkedList {
private:
    Node *head; // 头结点指针
    int size; // 链表长度

public:
    LinkedList(); // 构造函数
    ~LinkedList(); // 析构函数
    void insert(int index, int val); // 在指定位置插入节点
    void remove(int index); // 删除指定位置的节点
    void printList(); // 打印整个链表
};

3. 实现链表的插入、删除和打印方法

插入节点

插入节点需要先找到要插入的位置,然后插入节点,修改指针的指向。代码如下:

void LinkedList::insert(int index, int val) {
    if (index < 0 || index > size) { // 判断插入位置是否合法
        return;
    }

    Node *node = new Node(); // 创建新节点
    node->val = val;
    node->next = nullptr;

    if (index == 0) { // 若插入位置为0,则更新head指针
        node->next = head;
        head = node;
    } else {
        Node *prev = head;
        for (int i = 0; i < index - 1; i++) { // 找到要插入位置的前一个节点
            prev = prev->next;
        }
        node->next = prev->next; // 插入节点
        prev->next = node;
    }

    size++; // 修改链表长度
}

删除节点

删除节点需要先找到要删除的位置,然后将前一个节点的指针指向下一个节点,最后删除要删除的节点。代码如下:

void LinkedList::remove(int index) {
    if (index < 0 || index >= size) { // 判断删除位置是否合法
        return;
    }

    Node *prev = head;
    if (index == 0) { // 若删除位置为0,则更新head指针
        head = prev->next;
    } else {
        for (int i = 0; i < index - 1; i++) { // 找到要删除位置的前一个节点
            prev = prev->next;
        }
    }

    Node *node = prev->next; // 要删除的节点指针
    prev->next = node->next; // 将前一个节点的指针指向下一个节点
    delete node; // 删除节点
    size--; // 修改链表长度
}

打印链表

打印链表需要遍历整个链表,依次输出每个节点的数据。代码如下:

void LinkedList::printList() {
    Node *curr = head;
    while (curr != nullptr) { // 遍历整个链表
        cout << curr->val << " -> ";
        curr = curr->next;
    }
    cout << "NULL" << endl; // 最后一个节点指向NULL
}

示例说明

  1. 首先,我们创建一个空链表对象,然后插入若干元素,最后打印整个链表。代码如下:
LinkedList list;

list.insert(0, 1); // 在位置0插入元素1
list.insert(1, 2); // 在位置1插入元素2
list.insert(2, 3); // 在位置2插入元素3

list.printList(); // 打印链表结果为:1 -> 2 -> 3 -> NULL
  1. 然后,我们从链表中删除一个元素,并再次打印链表。代码如下:
list.remove(1); // 删除位置1的元素

list.printList(); // 打印链表结果为:1 -> 3 -> NULL

以上就是C++中链表的创建和基本操作的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++数据结构之链表的创建 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Python内存管理器如何实现池化技术

    Python内存管理器使用了池化技术来进行内存管理,这使得Python程序的内存管理效率比较高。下面我将详细介绍Python内存管理器如何实现池化技术: 1. 内存分配 Python内存管理器在Python运行时,会维护多个大小不同的内存块池,每个池的大小相同。当Python程序需要分配内存时,会首先在池中寻找是否有剩余内存块可以分配。如果有,则分配给程序使…

    数据结构 2023年5月17日
    00
  • 棋盘覆盖问题——分治法

    问题描述 有一个 x (k>0)的棋盘,恰好有一个方格与其他方格不同,称之为特殊方格。现在要用如下图所示的L形骨牌覆盖除了特殊方格以外的其他全部方格,骨牌可以任意旋转,并且任何两个骨牌不能重复。请给出一种覆盖方式。   样例: 输入: 输出:   思路——分治法: 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。 递归…

    算法与数据结构 2023年4月27日
    00
  • Java数据结构之链表、栈、队列、树的实现方法示例

    Java数据结构之链表、栈、队列、树的实现方法示例 链表 链表是一种线性数据结构,由节点的集合构成。每个节点包含两部分,数据部分和指针部分。数据部分用于存储数据,指针部分用于指向下一个节点。 单向链表示例 public class LinkedList<E>{ private Node<E> head; private int siz…

    数据结构 2023年5月17日
    00
  • Java数据结构之顺序表的实现

    下面是“Java数据结构之顺序表的实现”的完整攻略: 标题:Java数据结构之顺序表的实现 一、什么是顺序表 顺序表是一种线性表结构,其数据元素在物理位置上是连续的,通过下标访问,具有随机访问的优点。 二、顺序表的实现 使用Java语言实现顺序表,需要定义以下三个类: 1. SeqList类 构造顺序表的数据结构,并定义了一些基本操作,如插入、删除、修改等。…

    数据结构 2023年5月17日
    00
  • Golang实现数据结构Stack(堆栈)的示例详解

    Golang实现数据结构Stack(堆栈)的示例详解 什么是Stack? Stack,也称为堆栈,是一种先进后出(Last In First Out, LIFO)的数据结构。举个例子,比如一堆书,你按照一定的顺序叠起来,然后你想要拿出第一本,你需要先拿掉上面的书才能取到下面的。这就是典型的堆栈模型。 在编程中,Stack也是一种非常常见的数据结构,特别是在函…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之二叉堆

    Java 数据结构与算法系列精讲之二叉堆 什么是二叉堆? 二叉堆是一种基于完全二叉树的数据结构,它分为大根堆(MaxHeap)和小根堆(MinHeap)。大根堆的每个节点的值都大于(或等于)它的子节点的值,小根堆的每个节点的值都小于(或等于)它的子节点的值。 二叉堆的操作 二叉堆主要有以下几种操作: 插入元素:将元素插入到堆的最后一个叶子节点,然后通过上滤操…

    数据结构 2023年5月17日
    00
  • 字符串算法–$\mathcal{KMP,Trie}$树

    \(\mathcal{KMP算法}\) 实际上,完全没必要从\(S\)的每一个字符开始,暴力穷举每一种情况,\(Knuth、Morris\)和\(Pratt\)对该算法进行了改进,称为 \(KMP\) 算法。 而\(KMP\)的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配;而对于模式串的每一位,都有…

    算法与数据结构 2023年4月18日
    00
  • F – 产生冠军(不使用拓扑排序)

    题目描述 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部