C++ list(双向环状链表)的常用操作

C++ STL list操作,list采用link存储,参考资料(侯捷,STL源码剖析)

  • list 使用双向环状链表形式,环状链表只需一个标记,所以可以在链表尾端插入一个空白节点,使之符合STL前闭后开的规范
    在这里插入图片描述
  • list的主要操作transfer,移动元素的位置,splice基于transfer实现
// 将[first, last)内的所有元素移动到position之前, .操作符的优先级 > *操作符
/*
template<class T>
struct iterator{
	link_type<T>* node;
};

template<class T>
struct node{
	T data;
	node<T>* next;
	node<T>* prev;
};
*/
void transfer(iterator position, iterator first, iterator last){
	if(position != last){
		(last.node)->prev->next = position.node; //1
		(first.node)->prev->next = last.node;    //2
		(position.node->prev->next) = first.node;//3
		link_type tmp = link_type((position.node)->prev); //4
		(position.node)->prev = (last.node)->prev; //5
		(last.node)->prev = (first.node)->prev; //6
		(first.node)->prev = tmp; //7			
	}
}

在这里插入图片描述

  • 对list中元素进行排序的代码如下:
template <class T, class Alloc>
void list<T, Alloc>::sort(){
	// 判断,若是空链表或者仅有一个元素,就不进行任何操作
	if(node->next == node || link_type(node->next)->next == node)
		return;
	
	// 使用额外的中介数据存放区
	list<T, Alloc> carry;
	list<T, Alloc> counter[64]; // 差不多可排序2^64个元素
	int fill=0;
	while(!empty()){
		carry.splice(carry.begin(), *this, begin());  // 将this的第一个元素移到carry中, 不太清楚*this具体指的是什么
		int i=0;
		while(i<fill && !counter[i].empty()){
			counter[i].merge(carry);  // 将counter和carry的元素进行merge操作,存储到counter中
			carry.swap(counter[i++]); // 减counter的元素转存到carry中
			// 个人觉得这里可以直接carry.merge(counter[i++]);
		}
		carry.swap(counter[i]);  //carry中的元素转存到counter中
		if(i==fill) ++fill;
	}
	// 最后对全体的counter进行merge
	for(int i=1; i<fill; ++i){
		counter[i].merge(counter[i-1])
	}
	swap(counter[fill-1]);  // this->swap(counter[fill-1]);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C++实现双向循环链表的代码: ```cpp #include <iostream> using namespace std; // 双向循环链表节点结构体 struct Node { int data; Node *prev; Node *next; }; class DoubleLinkedList { private: Node *head; // 头节点 Node *tail; // 尾节点 int size; // 链表长度 public: DoubleLinkedList() { head = nullptr; tail = nullptr; size = 0; } // 在链表末尾添加节点 void addNode(int data) { Node *newNode = new Node(); newNode->data = data; newNode->prev = tail; newNode->next = head; if (size == 0) { head = newNode; tail = newNode; } else { tail->next = newNode; head->prev = newNode; tail = newNode; } size++; } // 在指定位置插入节点 void insertNode(int index, int data) { if (index < 0 || index > size) { cout << "Invalid index" << endl; return; } if (index == 0) { addNode(data); return; } if (index == size) { Node *newNode = new Node(); newNode->data = data; newNode->prev = tail; newNode->next = head; tail->next = newNode; head->prev = newNode; tail = newNode; size++; return; } Node *cur = head; for (int i = 0; i < index; i++) { cur = cur->next; } Node *newNode = new Node(); newNode->data = data; newNode->prev = cur->prev; newNode->next = cur; cur->prev->next = newNode; cur->prev = newNode; size++; } // 删除指定位置的节点 void deleteNode(int index) { if (index < 0 || index >= size) { cout << "Invalid index" << endl; return; } if (index == 0) { head = head->next; tail->next = head; head->prev = tail; size--; return; } if (index == size - 1) { tail = tail->prev; tail->next = head; head->prev = tail; size--; return; } Node *cur = head; for (int i = 0; i < index; i++) { cur = cur->next; } cur->prev->next = cur->next; cur->next->prev = cur->prev; size--; } // 获取指定位置的节点值 int get(int index) { if (index < 0 || index >= size) { cout << "Invalid index" << endl; return -1; } Node *cur = head; for (int i = 0; i < index; i++) { cur = cur->next; } return cur->data; } // 获取链表长度 int getSize() { return size; } // 打印链表 void printList() { if (size == 0) { cout << "Empty list" << endl; return; } Node *cur = head; for (int i = 0; i < size; i++) { cout << cur->data << " "; cur = cur->next; } cout << endl; } }; int main() { DoubleLinkedList list; list.addNode(1); list.addNode(2); list.addNode(3); list.addNode(4); list.printList(); // Output: 1 2 3 4 list.insertNode(2, 5); list.printList(); // Output: 1 2 5 3 4 list.deleteNode(3); list.printList(); // Output: 1 2 5 4 cout << "Size: " << list.getSize() << endl; // Output: Size: 4 cout << "Value at index 2: " << list.get(2) << endl; // Output: Value at index 2: 5 return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值