双向循环列表

双向循环列表的实现。

根据定义实现。不解释,具体细节看代码。

list.h

cpp 复制代码
#pragma once




#pragma pack(1)

typedef struct _MyListEntry {
	_MyListEntry* next;
	_MyListEntry* prev;
}MyListEntry;

#pragma pack()


class MyListClass {
public:
	MyListEntry* m_list=0;

	int m_keyOffset;
	int m_keySize;

	MyListClass();

	~MyListClass();

	int InsertEnd(MyListEntry* list);

	int InsertHead(MyListEntry* list);

	MyListEntry* Search(int offset,char * data,int size);

	int Remove(MyListEntry* list);


};

list.cpp

cpp 复制代码
#include "list.h"
#include <Windows.h>







MyListClass::MyListClass() {
	m_list = new MyListEntry;
	m_list->next = 0;
	m_list->prev = 0;
	m_keyOffset = 0;
	m_keySize = 0;
}


MyListClass::~MyListClass() {

	MyListEntry* n = m_list->next;
	MyListEntry* b = n;

	do
	{
		if (n == 0) {
			break;
		}

		MyListEntry* t = n;
		n = n->next;
		delete t;
	} while (n != b);

	if (m_list) {
		delete m_list;
	}
}


MyListEntry* MyListClass::Search(int offset,char * data,int size) {
	if (data == 0 || size == 0) {
		return 0;
	}

	MyListEntry* n = m_list->next;
	MyListEntry* b = n;

	do
	{
		if (n == 0) {
			break;
		}
		char* obj = (char*)((char*)n + offset);
		if (memcmp(data, obj,size) == 0) {
			return n;
		}
		n = n->next;

	} while (n != b);

	return 0;
}





int MyListClass::InsertHead(MyListEntry* list) {
	if (list == 0) {
		return 0;
	}
	MyListEntry* n = m_list->next;
	MyListEntry* p = m_list->prev;

	if (n == 0 || p == 0) {
		m_list->next = list;
		m_list->prev = list;

		list->prev = list;
		list->next = list;
		return 0;
	}

	p->next = list;
	n->prev = list;

	list->prev = p;
	list->next = n;

	m_list->next = list;

	return TRUE;
}

int MyListClass::InsertEnd(MyListEntry* list) {
	if (list == 0) {
		return 0;
	}

	MyListEntry* n = m_list->next;
	MyListEntry* p = m_list->prev;

	if (n == 0 || p == 0) {
		m_list->next = list;
		m_list->prev = list;
		list->next = list;
		list->prev = list;
		return TRUE;
	}

	p->next = list;
	n->prev = list;

	list->prev = p;
	list->next = n;

	m_list->prev = list;

	return TRUE;
}


int MyListClass::Remove(MyListEntry* list) {
	if (list == 0 || list == m_list) {
		return 0;
	}

	if (list == m_list->next) {
		
		MyListEntry* p = m_list->prev;
		if (p == list) {
			m_list->next = 0;
			m_list->prev = 0;
		}
		else {
			MyListEntry* n = m_list->next->next;
			n->prev = p;
			p->next = n;
			m_list->next = n;
		}
		delete list;		
		return TRUE;
	}
	else if (list == m_list->prev) {
		MyListEntry* n = m_list->next;	
		if (list == n) {
			m_list->next = 0;
			m_list->prev = 0;
		}
		else {
			MyListEntry* p = m_list->prev->prev;		
			n->prev = p;
			p->next = n;
			m_list->prev = p;
		}
		delete list;
		return TRUE;
	}

	MyListEntry* n = m_list->next;
	MyListEntry* b = n;
	do
	{
		if (list == n) {
			MyListEntry* prev = n->prev;
			MyListEntry* next = n->next;
			prev->next = next;
			next->prev = prev;
			delete list;
			return TRUE;
		}
		n = n->next;
	} while (n != b);

	return FALSE;
}
相关推荐
Darling噜啦啦6 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠7 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾7 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres8217 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q7 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒7 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记7 天前
单项不带头不循环链表
数据结构·链表
小糯米6017 天前
JS 数组
数据结构·算法·排序算法
小欣加油7 天前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
凌波粒7 天前
LeetCode--90.子集II(回溯算法)
数据结构·算法·leetcode