70,040
社区成员
发帖
与我相关
我的任务
分享你的代码运行出现访问异常的原因可能是指针操作过程中对链表节点的访问和修改不正确。以下是对你的代码问题的分析以及建议修改:
代码问题分析
头指针初始化错误:
cpp
复制代码
Node* head = 1;
这里将 head 初始化为 1 是错误的,head 应该指向链表的头节点,而不是直接赋值为一个整数值。这样会导致 head->next 的访问异常,因为 1 并不是有效的地址。
节点访问边界问题: 在 for 循环中:
cpp
复制代码
for (i = 1; i < locate && head->next; i++) {
head = head->next;
}
如果 locate 超出了链表的实际长度,head 可能会被移动到空指针上,随后代码中的访问 head->next 会导致访问异常。
链表断链问题: 当你删除节点时:
cpp
复制代码
head = temp->next;
这里并未正确更新上一个节点的 next 指针,可能会导致链表断开。
内存释放和数据访问问题: 在释放节点 temp 的内存后,你的代码试图返回该节点的 date 值:
cpp
复制代码
free(temp);
return delete_date;
如果释放内存后访问 delete_date,在某些系统下可能导致未定义行为(因为 delete_date 引用的值可能已经被释放)。
在你提供的代码中,存在以下几个问题:
head 初始化错误:Node* head = 1; 会导致 head 指针指向非法内存。应该初始化为传入的链表头指针 l,即 Node* head = l;。
访问越界检查:在遍历过程中,如果 locate 超过了链表长度,或者 head 指针已经是 nullptr 时继续访问 head->next,会导致非法访问。
目标节点前一个节点的处理:删除操作需要找到待删除节点的前一个节点,以便正确更新指针。
我们将正确地初始化 head,并在遍历过程中增加边界检查,以确保不越界访问。
Date delete_node(Node* l, int locate) {
if (l == nullptr || locate <= 1) {
throw std::out_of_range("Invalid locate or empty list");
}
Node* head = l;
Node* temp;
int delete_date;
// 找到待删除节点的前一个节点
for (int i = 1; i < locate - 1; i++) {
if (head->next == nullptr) { // 若locate超出链表范围
throw std::out_of_range("locate 超出链表范围");
}
head = head->next;
}
// 删除节点
temp = head->next;
if (temp == nullptr) { // 检查是否已经到达链表末尾
throw std::out_of_range("locate 超出链表范围");
}
delete_date = temp->data;
head->next = temp->next;
free(temp);
return delete_date;
}
输入参数检查:首先检查 l 是否为 nullptr,以及 locate 是否为有效位置(>1),否则直接抛出异常。
遍历到待删除节点的前一个节点:使用 for 循环找到 locate - 1 的位置,即待删除节点的前一个节点。如果在过程中 head->next 为 nullptr,说明 locate 超出链表长度,直接抛出异常。
删除操作:一旦找到待删除节点的前一个节点,temp 指向 head->next(即待删除节点)。如果 temp 为 nullptr,说明已经到达链表末尾,locate 无效,抛出异常。
返回删除的数据:在成功删除节点后,返回被删除节点的 data 值。
确保链表的内存管理正确,防止内存泄漏或野指针访问。如果 locate 为 1,表示要删除头节点,可以单独处理这种情况。
&&(head-> next != NULL)
先不说别的,你这个head->next为空就是循环退出的条件之一,后面居然就直接temp = head->next了,如果在i超出locate之前就head->next就为空,那你就是在试图把temp设为空指针,然后还试图访问和free一个空指针。
再者,你下标既然要从1开始而不从0开始(什么臭毛病?),那你这个locate难道不应该<=吗?链表插了3个节点,我输入3,然后我访问到2循环就退出了?
&&(head-> next != NULL)
head->next=temp->next;
&&(head-> next != NULL)

没有IF语句的指针操作,楼主是真不怕空指针啊
整型的“1”不能被当作“Node*”类型的指针名,在获取参数的时候就有异常。指针名的取名规则应该和变量的取名规则一致