typedef void DLinkList;
struct DLinkListNode {
DLinkListNode* pre;
DLinkListNode* next;
};
struct DLinkListObj {
DLinkListNode header;
DLinkListNode* slider;
int length;
};
DLinkList* createList() {
DLinkListObj* dlist = new DLinkListObj;
if (dlist != NULL) {
dlist->length = 0;
dlist->header.next = NULL;
dlist->header.pre = NULL;
dlist->slider = NULL;
}
return dlist;
}
void destoryList(DLinkList* list) {
if (list != NULL) {
delete list;
list = NULL;
}
}
void clearList(DLinkList* list) {
DLinkListObj* listobj = (DLinkListObj*)list;
if (list != NULL) {
listobj->length = 0;
listobj->header.next = NULL;
listobj->header.pre = NULL;
listobj->slider = NULL;
}
}
int getListLength(DLinkList* list) {
DLinkListObj* listobj = (DLinkListObj*)list;
int ret = -1;
if (listobj != NULL) {
ret = listobj->length;
}
return ret;
}
int insertNode(DLinkList* list, DLinkListNode* node, int pos) {
int ret = -1;
DLinkListObj* listobj = (DLinkListObj*)list;
if (list == NULL || node == NULL || pos < 0) {
return ret;
}
DLinkListNode* current = (DLinkListNode*)listobj;
DLinkListNode* next = NULL;
for (int i = 0; i < pos && current->next != NULL; i++) {
current = current->next;
}
next = current->next;
//first
current->next = node;
node->next = next;
//second
//判断是否为第一个元素
if (next != NULL) {
next->pre = node;
}
node->pre = current;
if (listobj->length == 0) {
listobj->slider = node;
}
//头插法处理 length=0时,头插法尾插法没有区别
if (current == (DLinkListNode*)listobj) {
node->pre = NULL;
}
listobj->length++;
return 0;
}
DLinkListNode* getNode(DLinkList* list, int pos) {
DLinkListObj* listobj = (DLinkListObj*)list;
DLinkListNode* ret = NULL;
if (list == NULL || pos>listobj->length || pos < 0) {
return ret;
}
DLinkListNode* current = (DLinkListNode*)listobj;
for (int i = 0; i < pos; i++) {
current = current->next;
}
ret = current->next;
return ret;
}
DLinkListNode* deleteNode(DLinkList* list, int pos) {
DLinkListObj* listobj = (DLinkListObj*)list;
DLinkListNode* ret = NULL;
if (list == NULL || pos > listobj->length || pos < 0) {
return ret;
}
DLinkListNode* current = (DLinkListNode*)listobj;
DLinkListNode* next = NULL;
for (int i = 0; i < pos && current->next != NULL; i++) {
current = current->next;
}
ret = current->next;
next = ret->next;
//first
current->next = next;
if (next != NULL) {
next->pre = current;
if (current == (DLinkListNode*)listobj) {//0号位置 特殊处理
next->pre = NULL;
}
}
if (listobj->slider == ret) {
listobj->slider = next;
}
listobj->length--;
return ret;
}
DLinkListNode* deleteNode(DLinkList* list, DLinkListNode* node) {
DLinkListObj* listobj = (DLinkListObj*)list;
DLinkListNode* ret = NULL;
if (listobj != NULL) {
int index = -1;
DLinkListNode* current = (DLinkListNode*)listobj;
for (int i = 0; i < listobj->length; i++) {
if (current->next == node) {
ret = current->next;
index = i;
break;
}
current = current->next;
}
if (ret != NULL) {
deleteNode(list, index);
}
return ret;
}
}
DLinkListNode* resetList(DLinkList* list) {
DLinkListObj* listobj = (DLinkListObj*)list;
DLinkListNode* ret = NULL;
if (listobj != NULL) {
listobj->slider = listobj->header.next;
ret = listobj->header.next;
}
return ret;
}
DLinkListNode* currentNode(DLinkList* list) {
DLinkListObj* listobj = (DLinkListObj*)list;
DLinkListNode* ret = NULL;
if (listobj != NULL) {
ret = listobj->slider;
}
return ret;
}
DLinkListNode* nextNode(DLinkList* list) {
DLinkListObj* listobj = (DLinkListObj*)list;
DLinkListNode* ret = NULL;
if (listobj != NULL) {
ret = listobj->slider;
listobj->slider = ret->next;
}
return ret;
}
DLinkListNode* preNode(DLinkList* list) {
DLinkListObj* listobj = (DLinkListObj*)list;
DLinkListNode* ret = NULL;
if (listobj != NULL&&listobj->slider!=NULL) {
ret = listobj->slider;
listobj->slider = ret->next;
}
return ret;
}
struct DListValue {
DLinkListNode node;
int value;
};
int main() {
DLinkList* list = createList();
DListValue v1, v2, v3, v4, v5;
v1.value = 1;
v2.value = 2;
v3.value = 3;
v4.value = 4;
v5.value = 5;
//尾插法
/*insertNode(list, (DLinkListNode*)&v1, getListLength(list));
insertNode(list, (DLinkListNode*)&v2, getListLength(list));
insertNode(list, (DLinkListNode*)&v3, getListLength(list));
insertNode(list, (DLinkListNode*)&v4, getListLength(list));
insertNode(list, (DLinkListNode*)&v5, getListLength(list));*/
//头插法
insertNode(list, (DLinkListNode*)&v1, 0);
insertNode(list, (DLinkListNode*)&v2, 0);
insertNode(list, (DLinkListNode*)&v3, 0);
insertNode(list, (DLinkListNode*)&v4, 0);
insertNode(list, (DLinkListNode*)&v5, 0);
deleteNode(list, getListLength(list) - 1);
deleteNode(list, 0);
for (int i = 0; i < getListLength(list); i++) {
DListValue* dv = (DListValue*)getNode(list, i);
DListValue* dvpre = (DListValue*)getNode(list, i)->pre;
DListValue* dvnext = (DListValue*)getNode(list, i)->next;
int vpre=0, vnext=0;
if (dvpre == NULL&& dvnext!=NULL) {
vpre = -1;
vnext = dvnext->value;
}
if (dvnext == NULL&& dvpre != NULL) {
vnext = -1;
vpre = dvpre->value;
}
if (dvpre != NULL && dvnext != NULL) {
vpre = dvpre->value;
vnext = dvnext->value;
}
cout << "dv value: " << dv->value << " pre: " << vpre << " dvnext: " << vnext << endl;;
}
system("pause");
return 0;
}
双向链表的实现
最新推荐文章于 2023-03-26 17:43:05 发布