C++數據結構之:鏈List

摘要:

??it人員無論是使用哪種高級語言開發東東,想要更高效有層次的開發程序的話都躲不開三件套:數據結構,算法和設計模式。數據結構是相互之間存在一種或多種特定關系的數據元素的集合,即帶“結構”的數據元素的集合,“結構”就是指數據元素之間存在的關系,分為邏輯結構和存儲結構。

??此系列專注講解數據結構數組、鏈表、隊列、棧、樹、哈希表、圖,通過介紹概念以及提及一些可能適用的場景,并以C++代碼簡易實現,多方面認識數據結構,最后為避免重復造輪子會淺提對應的STL容器。本文介紹的是鏈List。

(開發環境:VScode,C++17)

關鍵詞C++數據結構鏈表List

聲明:本文作者原創,轉載請附上文章出處與本文鏈接。

文章目錄

      • 摘要:
      • 正文:
        • 介紹:
          • 特性:
          • 應用:
        • 代碼實現:
        • 對應STL:
      • 推薦閱讀

正文:

介紹:

??鏈表(Linked List)是一種常見的數據結構,它通過一系列的節點(Node)來存儲數據,每個節點包含兩個部分:一個是數據域(Data Field),用于存儲數據;另一個是鏈接域(Link Field),用于存儲指向下一個節點的引用(在單鏈表中)或前一個節點和下一個節點的引用(在雙向鏈表中)。鏈表數據一般都是分散存儲于內存中 的,無須存儲在連續空間內。

雙向鏈表:

在這里插入圖片描述

特性:
  • 動態性:鏈表不需要在內存中預先分配固定大小的空間,可以根據需要動態地創建和刪除節點。這使得鏈表在處理不確定大小的數據集合時非常靈活。
  • 多種類型:鏈表有多種類型,包括單向鏈表、雙向鏈表、循環鏈表等。每種類型的鏈表都有其特定的應用場景和優缺點。
  • 插入和刪除效率高:在鏈表中插入或刪除一個節點時,只需要修改相關節點的指針(或引用)即可,而不需要移動大量數據。
  • 非連續性:鏈表中的節點在內存中不一定是連續存儲的。每個節點都包含一個指向下一個節點的指針(或引用),這些指針(或引用)將節點連接在一起。
應用:
  • 實現堆棧(Stack)和隊列(Queue)等抽象數據類型。
  • 在數據庫中實現鄰接列表來表示圖(Graph)。
  • 在瀏覽器中表示歷史記錄或書簽。
  • 在操作系統中表示進程列表或文件列表。
  • 在許多算法中,如歸并排序(Merge Sort)和快速排序(Quick Sort)的鏈表實現等。
代碼實現:
#clist.h
#ifndef CLIST_H
#define CLIST_H
#include <iostream>
#include <cstdlib>using namespace std;
// 鏈表結點
template <class T>
class DNode
{
public:DNode<T> *next;DNode<T> *prev;T data;
};// 雙向列表類
template <class T>
class CList
{
public:CList();                     // 默認構造函數CList(const CList& ln);      // 拷貝構造函數~CList();                    // 析構函數void add(T e);               // 向鏈表添加數據void remove(T index);        // 移除某個結點T find(int index);           // 查找結點bool empty();                // 判斷是否為空int size();                  // 鏈表長度void print();                // 顯示鏈表void print_reverse();        // 鏈表反向顯示void clear();                // 刪除全部結點
private:DNode<T> *head;DNode<T> *tail;int length;
};// 默認構造函數
template <typename T>
CList<T>::CList()
{head = new DNode<T>;tail = new DNode<T>;head->next = tail;head->prev = nullptr;tail->next = nullptr;tail->prev = head;length = 0;
}// 拷貝構造函數
template <typename T>
CList<T>::CList(const CList &ln)
{head = new DNode<T>;head->prev = nullptr;tail = new DNode<T>;head->next = tail;tail->prev = head;length = 0;DNode<T>* temp = ln.head;while (temp->next != ln.tail){temp = temp->next;tail->data = temp->data;DNode<T> *p = new DNode<T>;p->prev = tail;tail->next = p;tail = p;length++;}tail->next = nullptr;
}// 析構函數
template <typename T>
CList<T>::~CList()
{if (length == 0){delete head;delete tail;head = nullptr;tail = nullptr;return;}while (head->next != nullptr){DNode<T> *temp = head;head = head->next;delete temp;}delete head;head = nullptr;
}// 向鏈表添加數據
template <typename T>
void CList<T>::add(T e)
{DNode<T>* temp = this->tail;tail->data = e;tail->next = new DNode<T>;DNode<T> *p = tail;tail = tail->next;tail->prev = p;tail->next = nullptr;length++;
}// 查找結點
template <typename T>
T CList<T>::find(int index)
{if (length == 0){cout << "CList is empty";return -1;}if (index >= length){cout << "Out of bounds";return -1;}int x = 0;DNode<T> *p;p = head->next;while (p->next != nullptr && x++ != index){p = p->next;}return p->data;
}// 刪除結點
template <typename T>
void CList<T>::remove(T index)
{if (length == 0){cout << "CList is empty";return;}DNode<T> *p = head;while (p->next != nullptr){p = p->next;if (p->data == index){DNode<T> *temp = p->prev;temp->next = p->next;p->next->prev = temp;delete p;length--;return;}}
}// 刪除所有結點
template <typename T>
void CList<T>::clear()
{if (length == 0){return;}DNode<T> *p = head->next;while (p != tail){DNode<T>* temp = p;p = p->next;delete temp;}head->next = tail;tail->prev = head;length = 0;
}// 判斷是否為空
template <typename T>
bool CList<T>::empty()
{if (length == 0){return true;}else {return false;}
}// 鏈表長度
template <typename T>
int CList<T>::size()
{return length;
}// 輸出鏈表
template <typename T>
void CList<T>::print()
{if (length == 0){cout << "CList is empty" << endl;return;}DNode<T> *p = head->next;while (p != tail){cout << p->data << " ";p = p->next;}cout << endl;
}// 反向輸出鏈表
template <typename T>
void CList<T>::print_reverse()
{if (length == 0)return;DNode<T> *p = tail->prev;while (p != head){cout << p->data << " ";p = p->prev;}cout << endl;
}#endif // !CLIST_H
#clist.cpp
#include "clist.h"
#include <iostream>
using namespace std;int main(int argc, char**argv)
{CList<int> list;list.add(6);list.add(443);list.add(767);list.add(56);CList<int> list2(list);list2.print_reverse();list2.print();cout << "list2.size(): " << list2.size() << endl;cout << "list2.find(2): " << list2.find(2) << endl;list2.remove(443);list2.print();return 0;
}

在這里插入圖片描述

對應STL:
  • list:

    雙向循環鏈表。使用起來很高效,對于任意位置的插入和刪除都很快,在操作過后,以后指針、迭代器、引用都不會失效。

  • forward_list:

    單向鏈表。只支持單向訪問,在鏈表的任何位置進行插入/刪除操作都非常快

推薦閱讀

C/C++專欄:https://blog.csdn.net/weixin_45068267/category_12268204.html
(包含其它數據結構即對應的STL容器使用)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18675.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在HTML和CSS當中運用顯示隱藏

1.顯示與隱藏 盒子顯示:display:block;盒子隱藏: display:none:隱藏該元素并且該元素所占的空間也不存在了。 visibility:hidden:隱藏該元素但是該元素所占的內存空間還存在&#xff0c;即“隱身效果”。 2.圓角邊框 在CSS2中添加圓角&#xff0c;我們不得不使用背景圖像&am…

學習筆記——數據通信基礎——數據通信網絡(網絡工程師)

網絡工程師 網絡工程&#xff0c;就是圍繞著網絡進行的一系列的活動&#xff0c;包括∶網絡規劃、設計、實施、調試、排錯等。網絡工程設計的知識領域很寬廣&#xff0c;其中路由和交換是計算機網絡的基本。 網絡工程師∶是在網絡工程領域&#xff0c;掌握專業的網絡技術&…

散戶如何參與期權交易?

期權就是股票&#xff0c;唯一區別標的物上證指數&#xff0c;會看大盤吧&#xff0c;期權交易兩個方向認購做多&#xff0c;認沽做空&#xff0c;雙向t0交易沒了&#xff0c;期權交易跟期貨一樣&#xff0c;對的&#xff0c;玩的也是合約&#xff0c;唯一區別沒有保證金不會爆…

軍工行業運維解決方案

一、引言 隨著軍工行業的快速發展&#xff0c;信息化建設已成為提高作戰效能、保障信息安全的重要支撐。然而&#xff0c;軍工行業面臨著多戰區、跨區域、多陣地、多數據中心的復雜運維挑戰。為了滿足這些挑戰&#xff0c;我們提出了一套基于美信時代的軍工行業運維解決方案&am…

127.0.0.1 和 localhost 以及 0.0.0.0 區別

之前用 nginx 的時候&#xff0c;發現用這幾個 IP&#xff0c;都能正常訪問到 nginx 的歡迎網頁。一度認為這幾個 IP 都是一樣的。 但本質上還是有些區別的。 首先 localhost 就不叫 IP&#xff0c;它是一個域名&#xff0c;就跟 "baidu.com",是一個形式的東西&…

什么是Redis腦裂,如何解決呢

Redis 腦裂問題是指&#xff0c;在 Redis 哨兵模式或集群模式中&#xff0c;由于網絡原因&#xff0c;導致主節點&#xff08;Master&#xff09;與哨兵&#xff08;Sentinel&#xff09;和從節點&#xff08;Slave&#xff09;的通訊中斷&#xff0c;此時哨兵就會誤以為主節點…

方均根為什么等于有效值

方均根值&#xff08;Root Mean Square&#xff0c;簡稱RMS&#xff09;等于有效值&#xff0c;是因為這種計算方法能夠準確地反映周期性波動量&#xff08;如交流電、振動等&#xff09;的平均能量或做功能力。對于交流電而言&#xff0c;其瞬時值隨時間變化&#xff0c;直接取…

IdentiFace——多模態人臉識別系統,可捕捉從情緒到性別的所有信息及其潛力

1. 概述 面部識別系統的開發極大地推動了計算機視覺領域的發展。如今&#xff0c;人們正在積極開發多模態系統&#xff0c;將多種生物識別特征高效、有效地結合起來。 本文介紹了一種名為 IdentiFace 的多模態人臉識別系統。該系統利用基于 VGG-16 架構的模型&#xff0c;將人…

【NumPy】NumPy線性代數模塊詳解:掌握numpy.linalg的核心功能

&#x1f9d1; 博主簡介&#xff1a;阿里巴巴嵌入式技術專家&#xff0c;深耕嵌入式人工智能領域&#xff0c;具備多年的嵌入式硬件產品研發管理經驗。 &#x1f4d2; 博客介紹&#xff1a;分享嵌入式開發領域的相關知識、經驗、思考和感悟&#xff0c;歡迎關注。提供嵌入式方向…

多年期貨盈利的秘訣就是虧了就跑

不怎么看消息面&#xff0c;尤其期貨&#xff0c;外匯。 正大招主賬戶&#xff1a;歐美4恒指26小恒12 歡迎咨詢代理 詳YJCFPL 堅持學習&#xff0c;吸收別人的經驗&#xff0c;為我所用。 獨立思考&#xff0c;培養良好的生活習慣。 我能活到現在的秘訣就是&#xff1a;虧了就趕…

Hexo最新實戰:(一)Hexo7.0+GitHub Pages博客搭建

前言 很多平臺都能寫博客還有創作激勵&#xff0c;為什么我又要搭一個&#xff1f;為什么這次要選擇用Hexo框架&#xff1f; 對應的原因是流量自由和省錢&#xff0c;第一個&#xff0c;很多平臺能寫但不是都有收益&#xff0c;而且平臺有自身的規則&#xff0c;比如會屏蔽一…

【區塊鏈】外部應用程序與區塊鏈進行交互

一&#xff0c;外部應用程序與區塊鏈進行交互案例目標與流程 1.1案例目標 掌握FISCO BCOS應用環境的搭建 與使用&#xff08;FISCO BCOSWeBASE&#xff09;掌握基于Java SpringBoot的應 用程序后端項目搭建與開發。掌握應用程序后端與FISCO BCOS 鏈的交互。掌握應用程序前端…

『大模型筆記』量化 vs 剪枝 vs 蒸餾:為推理優化神經網絡!

量化 vs 剪枝 vs 蒸餾:為推理優化神經網絡! 文章目錄 一. 量化 vs 剪枝 vs 蒸餾:為推理優化神經網絡!1.1. 量化(Quantization)1.2. 剪枝(purning)1.3. 知識蒸餾(Knowledge Distillation,也稱為模型蒸餾)1.4. 工程優化(Engineering Optimizations)1.5. 總結二. 參考…

【旅行商問題的優化】

#include<bits/stdc.h> // 包含標準庫的頭文件using namespace std; // 使用標準命名空間template <class Type> // 模板聲明&#xff0c;Type為類型參數 class Traveling{ // 定義Traveling類friend Type Tsp(int **, int[],int, Type); // 聲明友元函數Tsp publi…

WPF hc:PropertyGrid 嵌套顯示

重點&#xff1a; 編寫Edit特性即可&#xff1a; public class ParameterEditor : PropertyEditorBase{public override FrameworkElement CreateElement(PropertyItem propertyItem){var pg new PropertyGrid();return pg;}public override DependencyProperty GetDependen…

2024/5/22 ARMday7

按鍵控制LED燈亮和滅 do_irq.c #include "key_it.h" //#include "led.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//獲取中斷號unsigned int irqno(GICC->IAR & (0x3FF));switch (irqno){case 99://處…

Playwright 元素定位

一、get_by_XXXXX 1. get_by_role&#xff1a;根據元素角色進行定位, 常用的參數有兩個&#xff0c;第一個是角色名稱 role&#xff0c;第二個是元素的文本 name。其他參數的解釋大家可以參考源碼注釋。 # 獲取頁面名稱為確定的按鈕 page.get_bt_role(button, name確定) pl…

cfa三級大神復習經驗分享系列(一)

教材還是Notes? 對于愚鈍如我之流&#xff0c;建議大家三級一定要看教材。Note很精華很濃縮&#xff0c;我覺得看過教材再看note感覺總結的很精辟&#xff0c;但是Note是以考點列的&#xff0c;而教材像小說一樣娓娓道來&#xff0c;有邏輯有情節&#xff0c;如果不follow很難…

Android MIPI屏配置

參考資料&#xff1a;RockChip發布的DRM Display Driver Development Guide手冊&#xff0c;以及網上大量相關博客資料 首先要拿到《屏幕硬件規格書》和《DataSheet》&#xff0c;軟件配置主要依靠DataSheet提供數據支持。 查閱DataSheet里面on sequence和off sequence說明&a…

機器學習之爬山算法(Hill Climbing Algorithm)

爬山算法(Hill Climbing Algorithm)是一種簡單而常見的啟發式搜索算法,通常用于解決優化問題。它的基本思想類似于登山過程中爬升到山頂的過程,即從一個起始點開始,不斷嘗試向鄰近的點移動,直到找到一個局部最優解。 下面是爬山算法的基本工作流程: 初始化:選擇一個初…