双向循环列表

双向循环列表的实现。

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

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;
}
相关推荐
神里流~霜灭1 小时前
数据结构:二叉树(三)·(重点)
c语言·数据结构·c++·算法·二叉树·红黑树·完全二叉树
zh_xuan1 小时前
LeeCode 57. 插入区间
c语言·开发语言·数据结构·算法
巷北夜未央1 小时前
数据结构之二叉树Python版
开发语言·数据结构·python
手握风云-2 小时前
优选算法的妙思之流:分治——快排专题
数据结构·算法
G皮T3 小时前
【Python Cookbook】字符串和文本(五):递归下降分析器
数据结构·python·正则表达式·字符串·编译原理·词法分析·语法解析
柯ran4 小时前
数据结构|排序算法(一)快速排序
数据结构·算法·排序算法
pipip.4 小时前
搜索二维矩阵
数据结构·算法·矩阵
念_ovo5 小时前
【算法/c++】利用中序遍历和后序遍历建二叉树
数据结构·c++·算法
_安晓5 小时前
数据结构 -- 图的存储
数据结构·算法
.YY001.6 小时前
数据结构第一轮复习--第六章图包含代码
数据结构·算法