双向循环列表的实现。
根据定义实现。不解释,具体细节看代码。
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;
}