当前位置:首页 > 通信资讯 > 正文

c++实现双向链表的增删改查(c实现双向链表)

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

c++实现双向链表的增删改查(c实现双向链表)

List.h

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 #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

?
1 2 3 4 5 6 7 8 #include "List.h" int main() { cout << "双向链表:" << endl; TestList(); return 0; }

效果:

c++实现双向链表的增删改查(c实现双向链表)

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

原文链接:https://blog.csdn.net/adorable_/article/details/80097346

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。