void DeleteDNode_Value(DLinkList& L, int a) { if (LengthList(L) == 0) { cout << "双链表为空" << endl; return; } DNode* p = L->next; DNode* q = L; while (p != NULL) { if (p->data == a) { if (p->next == NULL) { q->next = p->next; free(p); } else { q->next = p->next; p->next->prior = q; free(p); } return; } p = p->next; q = q->next; } cout << "没找到该数值" << endl; } //双链表删除元素(按位删除) void DeleteDNode_Pos(DLinkList& L, int a) { if (LengthList(L) == 0) { cout << "双链表为空" << endl; return; } if (a > LengthList(L)) { cout << "位序过大" << endl; return; } DNode* p = L->next; DNode* q = L; int pos = 1; while (pos < a) { p = p->next; q = q->next; pos++; } if (pos == a) { q->next = p->next; free(p); } else { q->next = p->next; p->next->prior = q; free(p); } }
时间: 2024-04-20 10:26:13 浏览: 93
dLinkList_双链表_
这段代码是关于双链表的删除操作。其中包含两个函数,分别是按值删除和按位删除。
函数DeleteDNode_Value根据给定的值a,在双链表L中查找并删除第一个值为a的节点。如果双链表为空,则输出"双链表为空",否则遍历双链表,找到值为a的节点后进行删除操作。如果找到的节点是最后一个节点,则需要将其前一个节点的next指针置为NULL,并释放该节点的内存;否则,将前一个节点的next指针指向待删除节点的下一个节点,同时将下一个节点的prior指针指向前一个节点,最后释放待删除节点的内存。
函数DeleteDNode_Pos根据给定的位序a,在双链表L中查找并删除第a个节点。如果双链表为空,则输出"双链表为空",如果位序a超过了双链表的长度,则输出"位序过大"。否则,通过遍历找到第a个节点,并进行删除操作。如果找到的是最后一个节点,则将其前一个节点的next指针置为NULL,并释放该节点的内存;否则,将前一个节点的next指针指向待删除节点的下一个节点,同时将下一个节点的prior指针指向前一个节点,最后释放待删除节点的内存。
需要注意的是,这段代码涉及到动态内存分配和释放,使用了free函数来释放内存。在实际编程中,可能需要根据具体情况使用delete或者delete[]来释放内存,以避免内存泄漏问题。
阅读全文