数据结构之双向循环链表(C++实现)

下午上机的时候大概地实现了链表的基本功能。写的时候也不是光是脑袋想,

就在word里面画了个粗糙的图形,边看边写。刚刚开始的时候功能可以不要

太多。把最基本的功能先实现,也就是数据定义,default constructor和destructor的功能

。然后测试,再增加功能,这样后来写的时候出错的时候就会很明朗,至少不会是前面写的

function出错了。g++和vc下调试通过。main里面的测试只是其中的一部分,写的时候删了许多。

双向循环链表。首先它是一个环状的,只是不是那么圆,就像一个蛇咬住了自己的尾巴,那个发现苯环

的人就是晚上做了个梦,蛇咬住了自己的尾巴,然后他发现了苯环的结构。灵感源自生活,所以我们程序员

虽然总是对着电脑,但是请不要忘了,离开了电脑我们还有很广阔的世界,说多了哈,刚刚打了下酱油。

接着上面的。然后它又是双向的,所以它应该有2个指针,一个就是pre(前驱),一个就是next(后继)。

就像右边这个图里面画的那样,画的不咋样,这个还是到寝室后重新画的。

清楚了它的结构,实现起来就比较简单了,某些功能比单链表实现起来更简单点,毕竟它是双向的,所以很灵活,链表的用途还是很广泛的,os里面的各种作业调度算法的实现都是和链表息息相关。所以它的重要性可见一斑了。

如果你自己感兴趣的话也可以自己去实现一下,C/C++都行。

链表的学习到这里就结束了,对数据结构,linux C/C++有着浓厚兴趣的同学可以加群91926913一起交流下。

最后请看下面的代码。

转载请注明出处,谢谢!

dclink.h

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
双向循环链表是一种链式存储结构,每个节点包含一个指向前驱节点和后继节点的指针。在C++语言中,可以通过定义一个双向循环链表类来实现数据结构。 以下是一个简单的双向循环链表类的实现: ```cpp class Node { public: int value; Node* prev; Node* next; Node(int v) : value(v), prev(nullptr), next(nullptr) {} }; class DoublyLinkedList { public: DoublyLinkedList() : head(nullptr), tail(nullptr), size(0) {} ~DoublyLinkedList() { while (head != nullptr) { Node* temp = head; head = head->next; delete temp; } tail = nullptr; size = 0; } bool empty() const { return size == 0; } int length() const { return size; } void push_front(int v) { Node* newNode = new Node(v); if (empty()) { head = tail = newNode; } else { newNode->next = head; head->prev = newNode; head = newNode; } tail->next = head; head->prev = tail; size++; } void push_back(int v) { if (empty()) { push_front(v); } else { Node* newNode = new Node(v); newNode->prev = tail; tail->next = newNode; tail = newNode; tail->next = head; head->prev = tail; size++; } } void pop_front() { if (size == 1) { delete head; head = tail = nullptr; size = 0; } else if (!empty()) { Node* temp = head; head = head->next; head->prev = tail; tail->next = head; delete temp; size--; } } void pop_back() { if (size == 1) { pop_front(); } else if (!empty()) { Node* temp = tail; tail = tail->prev; tail->next = head; head->prev = tail; delete temp; size--; } } private: Node* head; Node* tail; int size; }; ``` 该类包含两个私有成员变量 `head` 和 `tail`,分别指向链表的头节点和尾节点,以及一个整型变量 `size` 表示链表的长度。类的公有成员函数包括: - `empty()`:判断链表是否为空。 - `length()`:返回链表的长度。 - `push_front(int v)`:在链表头部插入一个值为 `v` 的节点。 - `push_back(int v)`:在链表尾部插入一个值为 `v` 的节点。 - `pop_front()`:删除链表头部的节点。 - `pop_back()`:删除链表尾部的节点。 注意,在插入第一个节点时,需要将 `head` 和 `tail` 都指向该节点,并且将该节点的 `next` 和 `prev` 指针都指向自身。在删除最后一个节点时,需要特别处理,即将 `head` 和 `tail` 都置为 `nullptr`。 可以使用以下代码进行测试: ```cpp #include <iostream> int main() { DoublyLinkedList list; std::cout << "Empty: " << list.empty() << std::endl; std::cout << "Length: " << list.length() << std::endl; list.push_back(1); list.push_front(2); list.push_back(3); std::cout << "Empty: " << list.empty() << std::endl; std::cout << "Length: " << list.length() << std::endl; list.pop_front(); list.pop_back(); std::cout << "Empty: " << list.empty() << std::endl; std::cout << "Length: " << list.length() << std::endl; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值