gpt4 book ai didi

c++ - 链表中的运行时错误

转载 作者:太空宇宙 更新时间:2023-11-04 14:53:55 25 4
gpt4 key购买 nike

我一直在使用链表(出于学习目的,使用 class)。这次我决定使用 friend 函数。该程序生成 2 个链表对象并调用 friend void mergeAlternate(LL LL1, LL LL2); 函数。 (LL 是我类(class)的名字)

mergeAlternate 函数从两个链表中获取节点并将它们交替放置。例如:

LL1: 1->2->3

LL2:4->5->6

答案:1->4->2->5->3->6

这是我的代码::

#include <iostream>
using namespace std;

class Node {
public:
int data;
Node *next;
Node(int data) {
this->data = data;
this->next = NULL;
}
};
class LL {
private:
Node *head;
public:

LL() : head(NULL) {
createLL();
}

void printLL(Node *head) {
if(head == NULL)
head = this->head;
Node *temp = head;
while (temp != NULL) {
cout << temp->data << "-->";
temp = temp->next;
}
cout << "NULL" << endl;
}

void createLL() {
head = new Node(2);
head->next = new Node(7);
head->next->next = new Node(8);
head->next->next->next = new Node(1);
head->next->next->next->next = new Node(4);
head->next->next->next->next->next = new Node(9);
}

friend void mergeAlternate(LL LL1, LL LL2);

~LL() {
Node *temp = NULL;
while (head != NULL) {
temp = head;
head = head->next;
delete temp;
}
}
};

void mergeAlternate(LL LL1, LL LL2) {
Node *head1 = LL1.head, *head2 = LL2.head;
Node *temp1, *temp2;
while ((head1 != NULL) && (head2 != NULL)) {
temp1 = head1->next;
temp2 = head2->next;
head1->next = head2;
head2->next = temp1;
if (temp1 == NULL)
break;
head1 = temp1;
head2 = temp2;
}
if (head2 != NULL) {
head1->next = head2;
}
LL2.head = NULL;
LL1.printLL(LL1.head);
}

int main() {
LL newLL, newLL2;
newLL2.printLL(NULL);
mergeAlternate(newLL, newLL2);
newLL2.printLL(NULL);
}

我有一个用于打印链表的printLL 函数。

问题是,在我的 mergeAlternate 中,我按值传递了 2 个链表。因此,我希望链表 newLLnewLL2 保持不变。但是,在 main 中,当我打印链接列表时执行 mergeAlternate 后,出现运行时错误,并打印类似这样的内容。

155672576-->155672672-->155672592-->155672688-->155672608-->155672704-->155672624-->155672720-->155672640-->155672736 -->155672656-->空

尽管我希望再次打印相同的输入链表。为什么会这样??有什么我想念的吗?感谢您的帮助:)

ideone 链接::http://ideone.com/apRCTw

最佳答案

你的函数 void mergeAlternate(LL LL1, LL LL2) 创建了两个新的局部变量 LLLL2 其成员 head 也将指向 newLLnewLL2 分别指向的同一内存地址。因为LL1LL2是函数的局部变量,所以当函数结束时,会调用它们各自的析构函数。根据您的析构函数定义:

~LL() {
Node *temp = NULL;
while (head != NULL) {
temp = head;
head = head->next;
delete temp;
}
}

它将取消分配 LL1LL2Nodes,但是因为它们与 newLL< 的内存地址相同newLL2 这意味着当函数结束时,这最后两个对象将在其成员 head 和后续引用中具有垃圾值,这将在尝试访问时导致错误他们的值(value)观。

关于c++ - 链表中的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31094602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com