IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 带头节点的双向循环链表的模拟实现以及链表内部算法的实现(排序、逆置)和内部迭代器的封装 -> 正文阅读

[数据结构与算法]带头节点的双向循环链表的模拟实现以及链表内部算法的实现(排序、逆置)和内部迭代器的封装


#include<iostream>
using namespace std;
//定义链表节点
template<class T>
struct CBListNode {
	CBListNode(const T& x=T())//链表节点构造函数
		:data(x)
		, next(nullptr)
		, prev(nullptr)
	{}
	T data;//数据域
	CBListNode<T>* next;
	CBListNode<T>* prev;
};
//封装迭代器
template<class T>
class CBListIterator {
public:
	typedef CBListNode<T> Node;
	typedef CBListIterator<T> Self;
public:
	CBListIterator( Node* node)
		:_node(node)
	{}
	T& operator*() {
		return _node->data;
	}
	T* operator->() {
		return &(operator*());
	}
	bool operator==(const Self& s) {
		return _node == s._node;
	}
	bool operator!=(const Self& s) {
		return _node != s._node;
	}
	Self& operator++() {
		_node = _node->next;
		return *this;
	}
	Self& operator++(int) {
		Self temp = *this;
		_node = _node->next;
		return temp;
	}
	Self& operator--() {
		_node = _node->prev;
		return this;
	}
	Self& operator--(int) {
		Self temp = this;
		_node = _node->prev;
		return temp;
	}
private:
	Node* _node;
};
//带头结点的双向循环链表的实现

template<class T>
class CBList {
public:
	typedef CBListNode<T> Node;
	typedef CBListIterator<T> iterator;
public:
	//构造函数
	CBList()
		:_head(new Node)//构造头节点
		,_size(0)//计数器,记录链表中元素个数
	{
		//双向循环链表初始哈是头节点的两个指针指向自身
		_head->next = _head;
		_head->prev = _head;
	}
	//下面是两个两个位置的迭代器,依靠这两个迭代器可以实现范围for
	iterator begin() {
		return iterator(_head->next);
	}
	iterator end() {
		return iterator(_head);
	}
	//尾插
	void push_back(const T& val) {
		Node* newnode = new Node(val);
		newnode->next = _head;
		newnode->prev = _head->prev;
		_head->prev->next = newnode;
		_head->prev = newnode;
		_size++;
	}
	//头插
	void push_front(const T& val) {
		Node* newnode = new Node(val);
		newnode->next = _head->next;
		_head->next->prev = newnode;
		newnode->prev = _head;
		_head->next = newnode;
		_size++;
	}
	//尾删
	void pop_back() {
		if (_size == 0) {
			return;//表示链表为空
		}
		Node* delnode = _head->prev;
		delnode->prev->next = _head;
		_head->prev = delnode->prev;
		delete delnode;
		delnode = nullptr;
		_size--;
	}
	//头删
	void pop_front() {
		if (_size == 0) {
			return;//链表为空不做删除
		}
		Node* delnode = _head->next;
		_head->next = delnode->next;
		delnode->next->prev = _head;
		delete delnode;
		delnode = nullptr;
		_size--;
	}
	//打印链表
	void show_list() {
		Node* p = _head->next;
		while (p != _head && p!=nullptr) {
			cout << p->data << " ";
			p = p->next;
		}
	}
	//按值删除
	void pop_list_by_val(const T& key) {
		if (_size == 0) {
			return;//链表为空不做删除操作
		}
		Node* delnode = _head->next;
		while(delnode != _head && delnode->data != key)
			delnode = delnode->next;//查找待删除元素位置

		if (delnode->data == key) {
			delnode->prev->next = delnode->next;
			delnode->next->prev = delnode->prev;
			delete delnode;
			delnode = nullptr;
			_size--;
		}
		else//可能元素不存在
			return;
	}
	//按值查找,返回所在链表第几个位置上的元素
	int find_by_val(const T& key) {
		Node* cur = _head->next;
		size_t count = 1;
		while (cur != _head) {
			if (cur->data == key) {
				return count;
			}
			count++;
			cur = cur->next;
		}
		//如果没有找到,返回-1
		return -1;
	}
	//修改元素
	void modifiy_val(const T& key,const T& val) {
		Node* cur = _head->next;
		//按key值查找待修改元素位置
		while (cur != _head && cur->data != key) {
			cur = cur->next;
		}
		if (cur->data == key) {
			cur->data = val;
		}
	}
	//清空链表中元素,但不删除头节点
	void clear() {
		Node* cur = _head->next;
		while (cur != _head) {
			Node* p = cur->next;
			free(cur);
			cur = p;
		}
		_head->next = _head->prev = _head;
		_size = 0;
	}
	//按值插入,按升序插入,较大元素插入较小元素后面
	void List_insert_byval(const T& val) {
		Node* cur = _head->next;
		//查找待插入位置
		while (cur != _head && val > cur->data) {
			cur = cur->next;
		}

		Node* newnode = new Node(val);
		newnode->next = cur;
		newnode->prev = cur->prev;
		cur->prev->next = newnode;
		cur->prev = newnode;

		_size++;
	}
	//链表排序
	void List_sort() {
		if (_size == 1 || _size == 0) {
			return;
		}//如果元素为0或1不做排序
		Node* p = _head->next;
		Node* q = p->next;
		//根据标记元素位置拆分链表
		p->next = _head;
		_head->prev = p;
		//将后段元素依次按升序插入
		while (q != _head) {
			p = q;
			q = p->next;
			Node* tmp = _head->next;
			//查找带插入位置
			while (tmp!=_head&&p->data > tmp->data) {
				tmp = tmp->next;
			}
			p->next = tmp;
			p->prev = tmp->prev;
			tmp->prev->next = p;
			tmp->prev = p;
		}
	}
	//链表逆置
	void List_reverse() {
		//如果链表元素个数为0或1,不做操作
		if (_size == 1 || _size == 0) {
			return;
		}
		Node* p = _head->next;
		Node* q = p->next;
		//拆链表
		p->next = _head;
		_head->prev = p;
		//将拆下来元素依次使用头插法插入链表
		while (q != _head) {
			p = q;
			q = p->next;

			p->next = _head->next;
			p->prev = _head;
			_head->next->prev = p;
			_head->next = p;
		}
	}
	//返回链表中元素个数
	size_t size() {
		return _size;
	}
	//返回第一个元素的值
	T& first_val(){
		return _head->next->data;
	}
	//返回最后一个元素的值
	T& Last_val() {
		return _head->prev->data;
	}
	//析构函数
	~CBList()
	{
		_destory();
	}
private:
	Node* _head;
	size_t _size;
private:
	void _destory() {
		//清空链表之后回收头节点
		clear();
		free(_head);
		_head = nullptr;

	}
};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:41:41  更:2021-12-04 13:42:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:36:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码