C++实现双向链表

本文实例为大家分享了C++实现动态顺序表的具体代码,供大家参考,具体内容如下

List.h

#pragma once

#include <stdio.h>

#include <iostream>

#include <assert.h>

using namespace std;

typedef int DataType;

struct ListNode

{

ListNode* _next; //存放下一个节点地址

ListNode* _prev; //存放上一个节点地址

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;

}

效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 C++实现双向链表 的全部内容, 来源链接: utcz.com/p/245208.html

回到顶部