最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)雙向鏈表(List)

 更新時間:2020年05月25日 09:23:14   作者:get_it_started  
這篇文章主要為大家詳細介紹了C++實現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

list是C++容器類中的“順序存儲結(jié)構(gòu)”所包含的一種結(jié)構(gòu)。list是非連續(xù)存儲結(jié)構(gòu),具有雙鏈表結(jié)構(gòu),支持前向/后向遍歷,且支持高效的隨機刪除/插入。

實現(xiàn)代碼如下:

**list.h**

#pragma once

#include<stdio.h>
#include<assert.h>
#include<iostream>
using namespace std;

typedef int DataType;

struct ListNode
{
 ListNode* _next;
 ListNode* _prev;

 DataType _data;

 ListNode(DataType x)
  :_data(x)
  , _next(NULL)
  , _prev(NULL)
 {}
};

**test.cpp**

#define _CRT_SECURE_NO_WARNINGS 1

#include "list.h"

class List{
 typedef ListNode Node;
public:
 List()
  :_head(new Node(DataType())){
  _head->_next = _head;
  _head->_prev = _head;
 }

 List(const List& l)
  :_head(new Node(DataType())){
  _head->_next = _head;
  _head->_prev = _head;
  Node* cur = l._head->_next;
  while (cur!=l._head){
   PushBack(cur->_data);
   cur = cur->_next;
  }
 }

 List& operator=(const List& l){
  if (this != &l){
   //swap(_head, l._head);
  }
  return *this;
 }

 ~List(){
  Node* cur = _head->_next;
  while (cur != _head){
   Node* next= cur->_next;
   delete cur;
   cur = next;
  }
  delete _head;
  _head = NULL;
 }

 void PushBack(DataType x){
  Node* prev = _head->_prev;
  Node* new_node = new Node(x);
  prev->_next = new_node;
  new_node->_prev = prev;
  _head->_prev = new_node;
  new_node->_next = _head;
 }

 void PushFront(DataType x){//插在頭結(jié)點之后
  Node* cur = _head->_next;
  Node* new_node = new Node(x);
  new_node->_next = cur;
  cur->_prev = new_node;
  new_node->_prev = _head;
  _head->_next = new_node;
 }

 void PopBack(){
  Node* delete_node = _head->_prev;
  Node* cur = delete_node->_prev;
  _head->_prev = cur;
  cur->_next = _head;
  delete delete_node;
 }

 void PopFront(){
  Node* delete_node = _head->_next;
  Node* cur = delete_node->_next;

  _head->_next = cur;
  cur->_prev = _head;
  delete delete_node;
 }

 Node* Find(DataType x){
  Node* to_find = _head->_next;
  while (to_find != _head){
   if (to_find->_data == x){
    return to_find;
   }
   to_find = to_find->_next;
  }
  return NULL;
 }

 void Insert(Node* pos, DataType x){//在pos位置前插入數(shù)據(jù)
  assert(pos);
  Node* new_node = new Node(x);
  Node* prev = pos->_prev;
  new_node->_next = pos;
  pos->_prev = new_node;
  new_node->_prev = prev;
  prev->_next = new_node;
 }

 void Erase(Node* pos){
  assert(pos);
  Node* prev = pos->_prev;
  Node* next = pos->_next;
  prev->_next = next;
  next->_prev = prev;
  delete pos;
 }

 void Print() const{
  Node* cur = _head->_next;
  cout <<" _head->";
  while (cur!= _head){
   cout << cur->_data << "->";
   cur = cur->_next;
  }
  cout << endl;
  Node* pos = _head->_prev;
  while (pos != _head){
   cout << pos->_data << "<-";
   pos = pos->_prev;
  }
  cout << "_head" << endl;
 }
private:
 Node* _head;
};

void TestList(){
 List L;
 L.PushBack(1);
 L.PushBack(2);
 L.PushBack(4);
 L.PushBack(5);
 L.PopBack();
 L.Print();

 ListNode* pos = L.Find(1); 
 printf("pos->data:%d[%p]\n",pos->_data,pos);
 pos = L.Find(2);
 printf("pos->data:%d[%p]\n", pos->_data, pos);
 pos = L.Find(4);
 printf("pos->data:%d[%p]\n", pos->_data, pos);
 printf("\n");

 L.Insert(pos, 3);
 L.Print();
 L.Erase(pos);
 L.Print();
 printf("\n");

 List L1;
 L1.PushFront(4);
 L1.PushFront(3);
 L1.PushFront(2);
 L1.PushFront(1);
 L1.Print();
 L1.PopFront();
 L1.Print();

}

int main(){
 TestList();
 return 0;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • c++ priority_queue用法入門超詳細教程

    c++ priority_queue用法入門超詳細教程

    priority_queue即優(yōu)先級隊列,它的使用場景很多,它底層是用大小根堆實現(xiàn)的,可以用log(n)的時間動態(tài)地維護數(shù)據(jù)的有序性,這篇文章主要介紹了c++ priority_queue用法入門超詳細教程,需要的朋友可以參考下
    2023-12-12
  • 舉例說明自定義C++異常處理的實例

    舉例說明自定義C++異常處理的實例

    這篇文章主要介紹了舉例說明自定義C++異常處理的實例的相關資料,這里舉例說明該如何使用C++ 的異常,需要的朋友可以參考下
    2017-10-10
  • C++/GoLang如何實現(xiàn)自底向上的歸并排序

    C++/GoLang如何實現(xiàn)自底向上的歸并排序

    這篇文章主要給大家介紹了關于C++/GoLang如何實現(xiàn)自底向上的歸并排序的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 在C語言編程中使用變量的基礎教程

    在C語言編程中使用變量的基礎教程

    這篇文章主要介紹了在C語言編程中使用變量的基礎教程,特別需要注意C語言中的指針變量,需要的朋友可以參考下
    2016-02-02
  • C語言利用cJSON解析JSON格式全過程

    C語言利用cJSON解析JSON格式全過程

    cJSON是用于解析json格式字符串的一套api,非常好用,下面這篇文章主要給大家介紹了關于C語言利用cJSON解析JSON格式的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • 離線安裝visual?studio2022+QT5.12的實現(xiàn)步驟

    離線安裝visual?studio2022+QT5.12的實現(xiàn)步驟

    近期有需求離線配置C++與QT環(huán)境,本文主要介紹了離線安裝visualstudio2022+QT5.12的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • 一文帶你深入了解C++中的類型轉(zhuǎn)換

    一文帶你深入了解C++中的類型轉(zhuǎn)換

    在C語言中,如果賦值運算符左右兩側(cè)類型不同,或者形參與實參類型不匹配,或者返回值類型與接收返回值類型不一致時,就需要發(fā)生類型轉(zhuǎn)化。本文主要介紹了C++中常見的四個類型轉(zhuǎn)換,需要的可以參考一下
    2022-12-12
  • C++11用兩個線程輪流打印整數(shù)的實現(xiàn)方法

    C++11用兩個線程輪流打印整數(shù)的實現(xiàn)方法

    這篇文章主要介紹了C++11用兩個線程輪流打印整數(shù)的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • C語言掃雷排雷小游戲?qū)崿F(xiàn)全程

    C語言掃雷排雷小游戲?qū)崿F(xiàn)全程

    本篇我將帶領大家攻克掃雷游戲各處難點,讓你寫掃雷不在困難,我們的掃雷游戲可以實現(xiàn)標記雷的功能和展開一片的功能。我們將分三個文件為大家介紹,分別為test.c,game.h和game.c
    2022-05-05
  • OpenCV實現(xiàn)圖像去噪算法的步驟詳解

    OpenCV實現(xiàn)圖像去噪算法的步驟詳解

    這篇文章主要為大家介紹了OpenCV中圖像去噪算法的原理,文中通過示例為大家詳細講解了圖像去噪算法的使用,感興趣的小伙伴可以了解一下
    2022-06-06

最新評論

青川县| 泰兴市| 乡城县| 屯门区| 孝义市| 廉江市| 舟山市| 四会市| 高雄市| 淅川县| 久治县| 丹江口市| 博客| 龙口市| 自贡市| 新疆| 平阴县| 固原市| 宜黄县| 六盘水市| 牟定县| 敖汉旗| 忻州市| 土默特左旗| 三门县| 汤阴县| 丽水市| 泽州县| 博乐市| 光山县| 浦城县| 永泰县| 陇南市| 丁青县| 垦利县| 南投市| 庆云县| 鹿泉市| 三台县| 同仁县| 武冈市|