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)文章
Qt實(shí)現(xiàn)繪制一個(gè)簡(jiǎn)單多邊形的示例代碼
QT提供了圖形繪制接口QPainter,通過該接口可以繪制多種圖形,包括多邊形。本文就來利用它實(shí)現(xiàn)繪制一個(gè)簡(jiǎn)單的多邊形,感興趣的可以嘗試一下2022-11-11
C語言超詳細(xì)講解循環(huán)與分支語句基礎(chǔ)
各位小伙伴們,今天給大家?guī)淼氖茄h(huán)與分支語句,本篇將會(huì)向大家介紹這些語句的格式和使用的基本方法,感興趣的朋友來看看吧2022-04-04
C++實(shí)現(xiàn)簡(jiǎn)單職工信息管理系統(tǒng)
本文給大家分享的是使用C++實(shí)現(xiàn)簡(jiǎn)單的職工信息管理系統(tǒng)的代碼,本系統(tǒng)采用了面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,所有的方法均以類為基礎(chǔ),感興趣的小伙伴們可以參考一下2015-08-08
C語言return知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于C語言return知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。2020-02-02

