C++中单链表操作的示例代码

yizhihongxing

我可以为您讲解C++中单链表的操作及示例代码。具体流程如下:

单链表操作的介绍

单链表是一种常见的数据结构,它由多个节点(结构体)组成,每个节点中都包含了下一个节点的指针。它的特点是插入和删除操作非常高效,但是访问操作需要遍历整个链表,效率较低。

单链表的结构体

首先,我们需要定义一个节点的结构体,来表示链表中的每个元素。例如:

struct Node {
  int val;
  Node *next;
};

其中,val表示节点中存储的元素值,next表示指向下一个节点的指针。

单链表的遍历

要遍历单链表,可以从头节点开始,沿着链表的每个节点,不断读取节点的值。示例代码如下:

void traverseList(Node *head) {
  Node *cur = head;
  while (cur != nullptr) {
    // 处理节点值
    cout << cur->val << " ";
    cur = cur->next;
  }
}

其中,head表示链表的头节点,cur表示当前节点的指针。通过while循环,不断将cur指针向后移动,直到遍历完整个链表。

单链表的插入

如果我们想在链表中插入一个元素,可以在遍历链表时找到合适的位置,并将新节点插入在该位置之后。示例代码如下:

void insertToList(Node *head, int val) {
  Node *cur = head;
  while (cur->next != nullptr && cur->next->val < val) {
    cur = cur->next;
  }
  Node *newNode = new Node({val, cur->next});
  cur->next = newNode;
}

其中,head表示链表的头节点,val表示要插入的元素值。在while循环中,不断将cur指针向后移动,直到找到需要插入的位置。然后,使用new关键字创建一个新节点,将val和cur->next作为参数传递,构造新的节点。最后将新节点插入到链表中。

单链表的删除

如果我们想在链表中删除一个元素,可以在遍历链表时找到该元素所在的位置,并将该节点删除。示例代码如下:

void deleteFromList(Node *head, int val) {
  Node *cur = head;
  while (cur->next != nullptr && cur->next->val != val) {
    cur = cur->next;
  }
  if (cur->next != nullptr && cur->next->val == val) {
    Node *temp = cur->next;
    cur->next = cur->next->next;
    delete temp;
  }
}

其中,head表示链表的头节点,val表示要删除的元素值。在while循环中,不断将cur指针向后移动,直到找到需要删除的位置。然后,将cur->next的指针指向下一个节点(即删除该节点),并使用delete关键字释放该节点的内存空间。

示例说明

下面给出两个简单的示例说明:

示例一

假如我们要实现一个链表,并按照从小到大的顺序插入元素,并打印出链表中的元素值。代码如下:

#include <iostream>
using namespace std;

struct Node {
  int val;
  Node *next;
};

void insertToList(Node *head, int val) {
  Node *cur = head;
  while (cur->next != nullptr && cur->next->val < val) {
    cur = cur->next;
  }
  Node *newNode = new Node({val, cur->next});
  cur->next = newNode;
}

void traverseList(Node *head) {
  Node *cur = head;
  while (cur != nullptr) {
    cout << cur->val << " ";
    cur = cur->next;
  }
}

int main() {
  Node *head = new Node({-1, nullptr});
  insertToList(head, 3);
  insertToList(head, 1);
  insertToList(head, 2);
  traverseList(head->next);
  return 0;
}

该示例代码会输出:1 2 3

示例二

假如我们要从一个链表中删除一个元素,并打印出链表中的元素值。代码如下:

#include <iostream>
using namespace std;

struct Node {
  int val;
  Node *next;
};

void deleteFromList(Node *head, int val) {
  Node *cur = head;
  while (cur->next != nullptr && cur->next->val != val) {
    cur = cur->next;
  }
  if (cur->next != nullptr && cur->next->val == val) {
    Node *temp = cur->next;
    cur->next = cur->next->next;
    delete temp;
  }
}

void traverseList(Node *head) {
  Node *cur = head;
  while (cur != nullptr) {
    cout << cur->val << " ";
    cur = cur->next;
  }
}

int main() {
  Node *head = new Node({-1, nullptr});
  Node *p = new Node({1, nullptr});
  head->next = p;
  Node *q = new Node({2, nullptr});
  p->next = q;
  Node *r = new Node({3, nullptr});
  q->next = r;
  deleteFromList(head, 2);
  traverseList(head->next);
  return 0;
}

该示例代码会输出:1 3

这就是关于C++中单链表操作的示例代码的完整攻略,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中单链表操作的示例代码 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Win10快速预览版19546怎么手动更新升级?

    关于Win10快速预览版19546如何手动更新升级的攻略,以下是具体步骤: 1. 打开设置界面 首先需要进入Windows 10系统的设置界面,在Windows 10任务栏中用鼠标单击“开始”菜单,然后单击设置图标。 2. 进入更新和安全选项 在Windows 10设置窗口中,找到“更新和安全”选项,单击进入。 3. 进入Windows 10预览版选项卡 在…

    other 2023年6月27日
    00
  • 设置jquery UI 控件的大小方法

    设置 jQuery UI 控件的大小是一个常见的需求。下面是一些常用的设置控件大小的方法: 1. 使用 CSS 可以使用 CSS 设置控件的大小。对于大多数控件,只需要定义宽度和高度即可。 例如,在 CSS 文件中定义一个类名为 .ui-control-size: .ui-control-size { width: 200px; height: 100px;…

    other 2023年6月27日
    00
  • 基于WPF实现代码查看器控件

    如题所述,我们要实现一个基于WPF的代码查看器控件。以下是详细的攻略过程: 1.准备工作 在开始实现代码查看器控件之前,我们需要先准备好开发环境:Visual Studio 2019和.NET Framework 4.6.1(或更高版本)。这里推荐使用WPF应用程序模板来创建项目。 2.创建代码查看器控件 我们可以创建一个自定义的用户控件,将其命名为“Cod…

    other 2023年6月27日
    00
  • 3种终极方法 彻底解决cdr不显示缩略图

    3种终极方法彻底解决cdr不显示缩略图 CorelDRAW是一款非常流行的矢量图形设计软件,但有时候在使用过程中会遇到cdr不显示缩略图的问题。这个问题可能会影响到我们的工作效率,因此需要及时解决。本攻略将介绍3种终极方法来彻底解决cdr不显示缩略图的问题。 方法1:重置缩略图缓存 重置缩略图缓存是解决cdr不显示缩略图问题的最简单方法之一。以下是具体步骤:…

    other 2023年5月6日
    00
  • 关于计算机科学:启发式和元启发式之间有什么区别?

    以下是关于“关于计算机科学:启发式和元启发式之间有什么区别?”的完整攻略,过程中包含两个示例。 背景 在计算机科学中,启发式和元启发式是两个常用的概念。它们都是指一种问题求解的方法,但它们之间有一些别。 启发式 启发式是一种问题求解的方法,它基于经验和直觉,而不是严格的算法或学模型。启发式算法通常用于解决那些难以用传统算法解决的问题。启发式算法的优点是速度快…

    other 2023年5月9日
    00
  • CentOS命令行性能检测工具详解

    下面是“CentOS命令行性能检测工具详解”的完整攻略: CentOS命令行性能检测工具详解 为什么要进行性能检测? 在实际的开发、测试、维护、部署等工作中,我们经常会需要对所运行的系统和应用进行性能检测,以评估其性能瓶颈、寻找优化方案等。而对于类Unix系统(如CentOS)中的命令行应用程序而言,我们可以通过一系列命令行工具进行性能检测,其中包括: to…

    other 2023年6月27日
    00
  • ArrayList的自动扩充机制实例解析

    下面我将详细讲解 “ArrayList的自动扩充机制实例解析”的完整攻略。 什么是ArrayList ArrayList是一个动态数组,可以随时添加、删除和修改元素。它实现了List接口,继承了AbstractList抽象类。由于它可以自动扩充容量,因此通常比静态数组更加方便易用。 ArrayList的自动扩充机制 当ArrayList添加元素时,若发现容量…

    other 2023年6月26日
    00
  • 关于c#:allowtransparency使最大化的过扫描

    在C#中,使用allowtransparency属性可以使窗体支持透明度。但是,当窗体最大化时,可能会出现过扫描的问题。以下是解决这个问题的完整攻略: 窗体样式 在allowtransparency属性之前,需要设置窗体样式。可以使用以下代码设置窗体样式: this.FormBorderStyle = FormBorderStyle.None; this.W…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部