#pragma once
#include <iostream>
#include <malloc.h>
using namespace std;
struct DLinkListNode {
DLinkListNode *pre;
DLinkListNode *next;
};
struct DLinkList {
DLinkListNode header;
DLinkListNode *cursor;
int length;
};
class dLinkList{
public:
dLinkList();
~dLinkList();
DLinkList* DLinkList_Create();
void DLinkList_Destroy(DLinkList* list);
void DLinkList_Clear(DLinkList* list);
int DLinkList_Length(DLinkList* list);
int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos);
DLinkListNode* DLinkList_Get(DLinkList* list, int pos);
DLinkListNode* DLinkList_Delete(DLinkList* list, int pos);
DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node);
DLinkListNode* DLinkList_Reset(DLinkList* list);
DLinkListNode* DLinkList_Current(DLinkList* list);
};
#include "dLinkList.h"
dLinkList::dLinkList() { }
dLinkList::~dLinkList() { }
DLinkList* dLinkList::DLinkList_Create() {
DLinkList *list = (struct DLinkList*)malloc(sizeof(struct DLinkList));
if ( list!=nullptr ) {
list->length = 0;
list->cursor = nullptr;
list->header.next = nullptr;
list->header.pre = nullptr;
}
return list;
}
void dLinkList::DLinkList_Destroy(DLinkList* list) {
if ( nullptr!=list ) {
free(list);
list = nullptr;
}
}
void dLinkList::DLinkList_Clear(DLinkList* list) {
if ( nullptr!=list ) {
list->length;
list->cursor = nullptr;
list->header.next = nullptr;
list->header.pre = nullptr;
}
}
int dLinkList::DLinkList_Length(DLinkList* list) {
int ret = -1;
if( list!=nullptr ){
ret = list->length;
}
return ret;
}
int dLinkList::DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos) {
int ret = -1;
ret = (list!=nullptr) && (node!=nullptr) && (pos>=0);
if ( ret ) {
pos = pos % (list->length+1);
DLinkListNode *current = &list->header;
for (int i = 0; i < pos; ++i ) {
current = current->next;
}
node->next = current->next;
node->pre = current;
current->next = node;
if( node->next!=nullptr )
node->next->pre = node;
if ( list->length==0 )
list->cursor = node;
++list->length;
}
return ret;
}
DLinkListNode* dLinkList::DLinkList_Get(DLinkList* list, int pos) {
DLinkListNode *ret = nullptr;
if ( (list!=nullptr)&&(pos>=0)&&(list->length>=0) ) {
pos = pos%list->length;
DLinkListNode *current = &list->header;
for (int i = 0; i < pos; ++i ) {
current = current->next;
}
ret = current->next;
}
return ret;
}
DLinkListNode* dLinkList::DLinkList_Delete(DLinkList* list, int pos) {
DLinkListNode *ret = nullptr;
if ( (list!=nullptr)&&(pos>=0)&&(list->length>0) ) {
pos = pos%list->length;
DLinkListNode *current = &list->header;
for (int i = 0; i < pos; ++i ) {
current = current->next;
}
ret = current->next;
current->next = ret->next;
if ( ret->next!=nullptr )
ret->next->pre = current ;
--list->length ;
if (list->cursor == ret) {
list->cursor = ret->next;
}
}
return ret;
}
DLinkListNode* dLinkList::DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node) {
DLinkListNode *ret = nullptr;
int i = 0;
if ( (list!=nullptr)&&(node!=nullptr)&&(list->length>0) ) {
DLinkListNode *current = &list->header;
for (i = 0; i < list->length; ++i ) {
current = current->next;
if ( node==current ) {
ret = current;
break;
}
}
if ( ret!=nullptr ) {
DLinkList_Delete(list,i);
}
}
return ret;
}
DLinkListNode* dLinkList::DLinkList_Reset(DLinkList* list) {
DLinkListNode *ret = nullptr;
if ( list!=nullptr ) {
list->cursor = list->header.next;
ret = list->cursor;
}
return ret;
}
#include "dLinkList.h"
struct student {
DLinkListNode node;
int age;
};
int main( int argc , char **argv ) {
dLinkList chen;
DLinkList *list = chen.DLinkList_Create();
if ( nullptr==list ) {
return -1;
}
student s1;
student s2;
student s3;
student s4;
student s5;
s1.age = 11;
s2.age = 22;
s3.age = 33;
s4.age = 44;
s5.age = 55;
chen.DLinkList_Insert( list , &s1.node , 0 );
chen.DLinkList_Insert( list , &s2.node , 0 );
chen.DLinkList_Insert( list , &s3.node , 0 );
chen.DLinkList_Insert( list , &s4.node , 0 );
chen.DLinkList_Insert( list , &s5.node , 0 );
for (int i = 0; i < chen.DLinkList_Length(list); ++i) {
student *node = (student*)chen.DLinkList_Get(list,i);
if( node!=nullptr )
cout << node->age << endl;
}
cout << "----------" << endl;
for (int i = 0; i < 5; ++i) {
student *node = (student*)chen.DLinkList_Delete(list, 0);
if (node != nullptr)
cout << node->age << endl;
}
system( "pause" );
return 0;
}