C++ 循环链表删除结点前驱函数 rcl_delete_pre
C++ 循环链表删除结点前驱函数 rcl_delete_pre
本文介绍使用 C++ 编写的函数 void rcl_delete_pre(chainList &p),用于删除循环链表中结点 p 的直接前驱。
#include <iostream>
struct Node {
int data;
Node* next;
};
typedef Node* chainList;
void rcl_delete_pre(chainList &p) {
if (p == nullptr || p->next == nullptr) {
std::cout << "Error: Invalid node or empty list!\n";
return;
}
chainList pre = p;
while (pre->next->next != p) {
pre = pre->next;
}
chainList temp = pre->next;
pre->next = p;
delete temp;
}
int main() {
// 创建循环链表示例
chainList list = new Node;
list->data = 1;
chainList node2 = new Node;
node2->data = 2;
chainList node3 = new Node;
node3->data = 3;
chainList node4 = new Node;
node4->data = 4;
list->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = list;
// 删除结点的直接前驱
std::cout << "Before deletion: ";
chainList curr = list;
do {
std::cout << curr->data << " ";
curr = curr->next;
} while (curr != list);
std::cout << "\n";
rcl_delete_pre(node3);
std::cout << "After deletion: ";
curr = list;
do {
std::cout << curr->data << " ";
curr = curr->next;
} while (curr != list);
std::cout << "\n";
// 释放内存
delete node4;
delete node3;
delete node2;
delete list;
return 0;
}
在上面的代码中,我们首先定义了结点的结构体 Node,然后使用 typedef 将 Node* 命名为 chainList,作为链表的别名。
函数 rcl_delete_pre 的实现如下:
- 首先,检查链表是否为空或结点 p 的下一个结点为 nullptr,这些情况下无法删除直接前驱,输出错误信息并返回。
- 创建一个指针 pre,指向结点 p。
- 通过循环找到结点 p 的直接前驱 pre,即 pre 的下一个结点的下一个结点为 p。
- 创建一个指针 temp,指向 pre 的下一个结点。
- 将 pre 的下一个结点指向 p,即删除了直接前驱。
- 删除 temp 指向的结点。
在主函数中,我们创建一个循环链表示例并展示删除前后的链表。最后,我们释放了动态分配的内存以避免内存泄漏。
请注意,此代码仅删除了直接前驱,如果需要删除任意结点的前驱,可以稍作修改。
代码解释
- 首先,定义了
Node结构体,其中包含data和next两个成员。data用于存储结点的数据,next指向下一个结点。 - 使用
typedef将Node*命名为chainList,方便代码编写和阅读。 - 函数
rcl_delete_pre接受一个chainList类型的参数p,该参数指向要删除其前驱的结点。 - 函数首先检查链表是否为空或结点 p 的下一个结点为
nullptr,如果为空,则输出错误信息并返回。 - 创建一个指针
pre,指向结点 p。 - 使用
while循环找到结点 p 的直接前驱pre,即pre的下一个结点的下一个结点为p。 - 创建一个指针
temp,指向pre的下一个结点。 - 将
pre的下一个结点指向p,即删除了pre的下一个结点(即temp指向的结点)。 - 删除
temp指向的结点,释放内存。
使用方法
- 创建一个循环链表。
- 调用
rcl_delete_pre函数,传入要删除其前驱的结点。
注意
- 此函数只删除了直接前驱,如果需要删除任意结点的前驱,可以稍作修改。
- 在使用此函数之前,请确保链表不为空且传入的结点有效。
- 删除结点后,需要释放内存以避免内存泄漏。
原文地址: https://www.cveoy.top/t/topic/blNz 著作权归作者所有。请勿转载和采集!