双向循环列表

双向循环列表的实现。

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

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;
}
相关推荐
涅槃寂雨29 分钟前
C语言小任务——寻找水仙花数
c语言·数据结构·算法
『往事』&白驹过隙;35 分钟前
操作系统(Linux Kernel 0.11&Linux Kernel 0.12)解读整理——内核初始化(main & init)之缓冲区的管理
linux·c语言·数据结构·物联网·操作系统
就爱学编程37 分钟前
从C语言看数据结构和算法:复杂度决定性能
c语言·数据结构·算法
半桔42 分钟前
栈和队列(C语言)
c语言·开发语言·数据结构·c++·git
墨楠。2 小时前
数据结构学习记录-树和二叉树
数据结构·学习·算法
Aqua Cheng.3 小时前
MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索
java·数据结构·算法
qy发大财3 小时前
平衡二叉树(力扣110)
数据结构·算法·leetcode·职场和发展
佳心饼干-3 小时前
数据结构-栈
开发语言·数据结构
自由自在的小Bird5 小时前
简单排序算法
数据结构·算法·排序算法
萧萧玉树7 小时前
B树系列详解
数据结构·b树