双向循环列表

双向循环列表的实现。

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

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;
}
相关推荐
眼镜哥(with glasses)26 分钟前
蓝桥杯 国赛2024python(b组)题目(1-3)
数据结构·算法·蓝桥杯
int型码农5 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
怀旧,5 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
积极向上的向日葵6 小时前
有效的括号题解
数据结构·算法·
Java 技术轻分享6 小时前
《树数据结构解析:核心概念、类型特性、应用场景及选择策略》
数据结构·算法·二叉树··都差速
chao_7897 小时前
链表题解——两两交换链表中的节点【LeetCode】
数据结构·python·leetcode·链表
曦月逸霜8 小时前
第34次CCF-CSP认证真题解析(目标300分做法)
数据结构·c++·算法
吴声子夜歌11 小时前
OpenCV——Mat类及常用数据结构
数据结构·opencv·webpack
笑口常开xpr12 小时前
数 据 结 构 进 阶:哨 兵 位 的 头 结 点 如 何 简 化 链 表 操 作
数据结构·链表·哨兵位的头节点
@我漫长的孤独流浪12 小时前
数据结构测试模拟题(4)
数据结构·c++·算法