从0开始学C++ 第二十七课 数据结构入门 - 数组与链表

这篇具有很好参考价值的文章主要介绍了从0开始学C++ 第二十七课 数据结构入门 - 数组与链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第二十七课:数据结构入门 - 数组与链表

学习目标:

  1. 理解数组的基本概念和操作。
  2. 掌握链表的基本结构与特点。
  3. 学会在C++中定义和操作数组和链表。
  4. 了解数组和链表的基本使用场景。

学习内容:

  1. 数组(Array)

    • 概念:数组是一种线性数据结构,用一段连续的内存空间来存储一系列相同类型的元素。
    • 参数用法:
      • 索引(Index):数组中每个元素的位置,通常从0开始。
      • 长度(Length):数组中元素的数量,确定数组大小的属性。
    • 代码示例:
      #include <iostream>
      using namespace std;
      
      int main() {
          int arr[5] = {1, 2, 3, 4, 5}; // 声明并初始化一个整型数组
      
          // 访问并打印数组元素
          for (int i = 0; i < 5; i++) {
              cout << "Element at index " << i << ": " << arr[i] << endl;
          }
      
          return 0;
      }
      
    • 预计输出效果:
      Element at index 0: 1
      Element at index 1: 2
      Element at index 2: 3
      Element at index 3: 4
      Element at index 4: 5
      
    • 使用场景:数组通常用于存储固定数目的元素,适合快速地通过索引查询元素。
  2. 链表(LinkedList)

    • 概念:链表是一种线性结构,由一系列不必在内存中连续存储的元素组成,每个元素均包含数据部分和指向下一个元素的指针。
    • 参数用法:
      • 节点(Node):链表中的元素,包含数据和指向下一个节点的指针。
      • 头指针(Head):指向链表的第一个节点的指针。
    • 代码示例:
      #include <iostream>
      using namespace std;
      
      // 定义链表节点结构体
      struct Node {
          int data;
          Node* next;
      };
      
      // 打印链表函数
      void printList(Node* n) {
          while (n != nullptr) {
              cout << n->data << " ";
              n = n->next;
          }
          cout << endl;
      }
      
      int main() {
          Node* head = new Node();
          Node* second = new Node();
          Node* third = new Node();
      
          head->data = 1; // 赋值
          head->next = second; // 指向下一个节点
      
          second->data = 2;
          second->next = third;
      
          third->data = 3;
          third->next = nullptr;
      
          printList(head); // 打印链表
      
          return 0;
      }
      
    • 预计输出效果:
      1 2 3
      
    • 使用场景:链表适合于元素数量变动较大的情况,便于插入和删除元素,但访问特定位置的元素较慢。

链表遍历与插入

  1. 链表的遍历

    • 链表的遍历意味着按照链表的指针从头到尾访问每个节点。
    • 遍历通常使用循环或递归来完成。
  2. 链表中的数据插入

    • 链表中的数据可以在头部、尾部或任意给定节点后插入。
    • 插入操作需要更改节点的指针以维护链表的结构。

链表的节点定义示例(C++):

class ListNode {
public:
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr)};

遍历链表示例(C++):

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

链表中数据插入示例(C++):

  1. 在头部插入:
ListNode* insertAtHead(ListNode* head, int x) {
    ListNode* newNode = new ListNode(x);
    newNode->next = head;
    head = newNode;
    return head;
}
  1. 在尾部插入:
ListNode* insertAtTail(ListNode* head, int x) {
    ListNode* newNode = new ListNode(x);
    if(head == nullptr) {
        return newNode;
    }
    ListNode* temp = head;
    while(temp->next != nullptr) {
        temp = temp->next;
    }
    temp->next = newNode;
    return head;
}
  1. 在给定节点后插入:
void insertAfterNode(ListNode* prevNode, int x) {
    if(prevNode == nullptr) {
        cout << "The given previous node cannot be null." << endl;
        return;
    }
    ListNode* newNode = new ListNode(x);
    newNode->next = prevNode->next;
    prevNode->next = newNode;
}

练习题:

  1. 实现一个单链表,并定义一个函数遍历此链表。
  2. 写出一个函数,在单链表的头部插入一个节点。
  3. 写出一个函数,在单链表的尾部插入一个节点。
  4. 写出一个函数,在单链表的某个节点后插入一个新节点。
#include <iostream>

class ListNode {
public:
    int val;
    ListNode *next;

    ListNode(int x) : val(x), next(nullptr)};

class SinglyLinkedList {
public:
    ListNode *head;

    SinglyLinkedList() : head(nullptr)    // 遍历链表
    void traverseList() {
        ListNode *temp = head;
        while (temp != nullptr) {
            std::cout << temp->val << " ";
            temp = temp->next;
        }
        std::cout << std::endl;
    }

    // 在头部插入节点
    void insertAtHead(int x) {
        ListNode *newNode = new ListNode(x);
        newNode->next = head;
        head = newNode;
    }

    // 在尾部插入节点
    void insertAtTail(int x) {
        ListNode *newNode = new ListNode(x);
        if (head == nullptr) {
            head = newNode;
        } else {
            ListNode *temp = head;
            while (temp->next != nullptr) {
                temp = temp->next;
            }
            temp->next = newNode;
        }
    }

    // 在某个节点后插入新节点
    void insertAfterNode(ListNode *prevNode, int x) {
        if (prevNode == nullptr) {
            std::cout << "The given previous node cannot be null." << std::endl;
            return;
        }
        ListNode *newNode = new ListNode(x);
        newNode->next = prevNode->next;
        prevNode->next = newNode;
    }
};

int main() {
    SinglyLinkedList list;

    // 在链表头部插入节点
    list.insertAtHead(5);
    list.insertAtHead(3);
    list.insertAtHead(1);

    // 在链表尾部插入节点
    list.insertAtTail(7);
    list.insertAtTail(9);

    // 遍历链表
    list.traverseList();

    // 在链表中第一个节点后插入新节点
    list.insertAfterNode(list.head, 2);

    // 再次遍历链表
    list.traverseList();

    return 0;
}


目录
第二十八课 数据结构深入 - 栈和队列文章来源地址https://www.toymoban.com/news/detail-818819.html

到了这里,关于从0开始学C++ 第二十七课 数据结构入门 - 数组与链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

    目录  前言: 委托构造函数: 类内初始化: 空指针: 枚举类: 总结:         C++的学习难度大,内容繁多。因此我们要及时掌握C++的各种特性,因此我们更新本篇文章,向大家介绍C++的新增特性。 委托构造函数是指一 个类的构造函数调用另一个类的构造函数,以减少代

    2024年02月13日
    浏览(56)
  • 【从零开始学习C++ | 第二十二篇】C++新增特性(下)

    目录 前言: 类型推导: constexpr: 初始化列表: 基于范围的for循环: 智能指针之unique ptr Lambda表达式: 总结:         本文我们将继续介绍   C++ 11 新增十大特性的剩余六个,如果没有看过介绍前四个特性的小伙伴的可以点进我C++的专栏就可以看到。 类型推导(

    2024年02月14日
    浏览(53)
  • 【从零开始学习JAVA | 第二十三篇】集合体系结构

    目录 前言: 单列集合:      set与list的区别: 双列集合: map的特点: 总结:                   JAVA中为我们提供了很多集合,这些集合都有自己很独特的特点,因此我们要学习所有的集合,但是在学习所有的集合之前,我们还是先为大家介绍一下JAVA的集合体系结构,这

    2024年02月16日
    浏览(47)
  • C++算法之旅、05 基础篇 | 第二章 数据结构

    常用代码模板2——数据结构 - AcWing 使用结构体指针,new Node() 非常慢,创建10万个节点就超时了,做笔试题不会用这种方式(优化是提前初始化好数组,但这样跟数组模拟没区别了,而且代码量很长) 使用两个数组,e存储val,ne存储next。空节点next用-1表示 826. 单链表 - AcWi

    2024年02月10日
    浏览(41)
  • C语言第二十七弹---内存函数

    ✨ 个人主页:  熬夜学编程的小林 💗 系列专栏:  【C语言详解】 【数据结构详解】 内存函数 1、memcpy 使用和模拟实现 2、memmove 使用和模拟实现 3、memset 函数的使用 4、memcmp 函数的使用 总结 前面两弹讲解了字符函数和字符串函数,但是在我们实际运用中不仅仅只有这些

    2024年02月19日
    浏览(26)
  • 第二十七章 Unity碰撞体Collision(下)

    本章节我们继续研究碰撞体,并且探索一下碰撞体与刚体之间的联系。我们回到之前的工程,然后给我们的紫色球体Sphere1也添加一个刚体组件。如下所示 此时,两个球体都具备了碰撞体和刚体组件。接下来,我们Play运行查看效果 我们发现,黄球碰撞紫球之后,两者都向右移

    2024年02月09日
    浏览(29)
  • 【LeetCode75】第二十七题(933)最近的请求次数

    目录 题目: 示例: 分析: 代码+运行结果: 首先这是LeetCode75里第一道设计类的题目,这种类型的题目会比较新颖,就是按照题目要求来设计一个类。然后测试用例是模拟真实调用类的成员函数的。 这道题也算是简单题,整个类除了构造函数以外就一个成员函数,测试用例

    2024年02月13日
    浏览(24)
  • 学C的第二十七天【指针的进阶(三)】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第二十六天【指针的进阶(二)】_高高的胖子的博客-CSDN博客  ================================

    2024年02月16日
    浏览(31)
  • 第二十七章 配置 Web Gateway 的默认参数 - 安全

    如果此处定义了用户名和密码,则所有系统管理员都必须提供此用户名和密码才能访问 Web Gateway 管理页面。 如果忘记密码,请使用以下步骤设置新密码: 编辑配置文件以指定新的用户名和密码值;在文件的 SYSTEM 部分进行更改。可以以明文形式指定密码的值。 重新启动网络

    2024年04月26日
    浏览(23)
  • vue 3 第二十七章:样式(动态class、动态style)

    在 Vue 中,我们可以使用动态绑定语法来动态地添加类名或样式。本章将介绍 Vue 3 中如何使用动态绑定语法来动态地添加类名或样式。 在 Vue 中,我们可以使用 :class 或 v-bind:class 指令来动态地添加类名。例如,下面的例子中,我们可以根据 isActive 的值动态地为元素添加 act

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包