C++實(shí)現(xiàn)雙向鏈表
更新時(shí)間:2020年05月25日 08:42:24 作者:adorable_
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了C++實(shí)現(xiàn)動(dòng)態(tài)順序表的具體代碼,供大家參考,具體內(nèi)容如下

List.h
#pragma once
#include <stdio.h>
#include <iostream>
#include <assert.h>
using namespace std;
typedef int DataType;
struct ListNode
{
ListNode* _next; //存放下一個(gè)節(jié)點(diǎn)地址
ListNode* _prev; //存放上一個(gè)節(jié)點(diǎn)地址
DataType _data;
ListNode(DataType x)
:_data(x)
, _next(NULL)
, _prev(NULL)
{}
};
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=(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 Print() const
{
Node* cur = _head->_next;
cout << "head->";
while (cur != _head)
{
cout << cur->_data << "->";
cur = cur->_next;
}
cout << endl;
Node* tail = _head->_prev;
while (tail != _head)
{
cout << tail->_data << "->";
tail = tail->_prev;
}
cout << "head" << endl;
}
void PushBack(DataType x);
void PushFront(DataType x);
void PopBack();
void PopFront();
ListNode* Find(DataType x);
void Insert(Node* pos, DataType x);
void Erase(Node* pos);
private:
Node* _head;
};
void List::PushBack(DataType x)
{
Node* tail = _head->_prev;
Node* new_node = new Node(x);
tail->_next = new_node;
new_node->_prev = tail;
new_node->_next = _head;
_head->_prev = new_node;
//Insert(_head, x);
}
void List::PushFront(DataType x)
{
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;
//Insert(_head->_next, x);
}
void List::PopBack()
{
Node* to_delete = _head->_prev;
Node* cur = to_delete->_prev;
cur->_next = _head;
_head->_prev = cur;
delete to_delete;
//Erase(_head->_prev);
}
void List::PopFront()
{
Node* to_delete = _head->_next;
Node* cur = to_delete->_next;
cur->_prev = _head;
_head->_next = cur;
delete to_delete;
//Erase(_head->_next);
}
ListNode* List::Find(DataType x)
{
Node* cur = _head->_next;
while (cur != _head)
{
if (cur->_data == x)
{
return cur;
}
cur = cur->_next;
}
return NULL;
}
void List::Insert(Node* pos, DataType x)
{
assert(pos);
Node* prev = pos->_prev;
Node* new_node = new Node(x);
new_node->_next = pos;
pos->_prev = new_node;
prev->_next = new_node;
new_node->_prev = prev;
}
void List::Erase(Node* pos)
{
assert(pos);
Node* prev = pos->_prev;
Node* next = pos->_next;
prev->_next = next;
next->_prev = prev;
delete pos;
}
void TestList()
{
List l;
l.PushBack(1);
l.PushBack(2);
l.PushBack(3);
l.PushBack(4);
l.PopBack();
l.Print();
ListNode* pos = l.Find(2);
printf("pos->_data expext 2, actual %d:[%p]\n", pos->_data, pos);
pos = l.Find(4);
printf("pos->_data expext NULL, actual [%p]\n", pos);
pos = l.Find(1);
printf("pos->_data expext 1, actual %d:[%p]\n", pos->_data, pos);
l.Insert(pos, 0);
l.Print();
l.Erase(pos);
l.Print();
List l1(l);
l1.PushFront(8);
l1.PushFront(7);
l1.PushFront(6);
l1.PushFront(5);
l1.PopFront();
l1.Print();
List l2;
l2 = l;
l2.Print();
}
test.cpp
#include "List.h"
int main()
{
cout << "雙向鏈表:" << endl;
TestList();
return 0;
}
效果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺析C++中boost.variant的幾種訪(fǎng)問(wèn)方法
variant類(lèi)型在C++14并沒(méi)有加入,若想在不支持C++17的編譯器上使用variant類(lèi)型,我們可以通過(guò)boost的variant類(lèi)型,variant類(lèi)型可以表示任意一種類(lèi)型和any類(lèi)型有些相似,但還是有些區(qū)別下面將淺談variant的幾種訪(fǎng)問(wèn)方法,感興趣的朋友們下面來(lái)一起看看吧。2016-10-10
c++中string類(lèi)成員函數(shù)c_str()的用法
c_str()函數(shù)返回一個(gè)指向正規(guī)c字符串的指針,內(nèi)容和string類(lèi)的本身對(duì)象是一樣的,通過(guò)string類(lèi)的c_str()函數(shù)能夠把string對(duì)象轉(zhuǎn)換成c中的字符串的樣式2013-09-09
C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼
HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無(wú)狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請(qǐng)求,需要的朋友可以參考下2023-11-11
linux下C/C++學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了linux下c/c++學(xué)生信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
C++實(shí)現(xiàn)讀寫(xiě)文件的示例代碼
這篇文章主要介紹了C++實(shí)現(xiàn)讀寫(xiě)文件的示例代碼,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-08-08

