gpt4 book ai didi

c++ - 遍历 LinkedList 时读取访问冲突

转载 作者:行者123 更新时间:2023-11-28 01:55:07 25 4
gpt4 key购买 nike

我正在创建一个行星模拟,它使用双向链表和多个循环来计算力、碰撞等。我遇到的问题是由于碰撞而尝试删除行星时出现读取访问冲突错误。

当检查碰撞时,删除两个行星中较小的行星,我的写法是等式中较小的行星可以来自包围环,如果删除则打破环。

刚接触C的组合;几天来一直盯着同一个问题;我的类(class)讲师让我们使用 C/C++ 混合体,这让我很难想出一种有效的方法来解决这个问题。将循环移出可以并且已经解决了这个问题,但是对模拟的性能有很大的影响。

代码如下:

struct planet *head; //Head of list
struct planet *tail; //Tail of list

struct planet {
//Data
float mass;
struct planet *next;
struct planet *prev;
};

planet *remove(struct planet* p) {//Breaking the tree
if (p == head) {
removeHead(); //Method not included in sample due to size and it is sound.
}
else if (p == tail) {
removeTail();//Method not included in sample due to size and it is sound.
}
else {
p->prev->next = p->next;
p->next->prev = p->prev;
}
return p;
}

planet *destroy(struct planet* p) {
if (p) {
if (p != head || p != tail || (!p->next && p->prev)) {
delete p;
printf("Deleted\n");
return 0;
}
else {
printf("Not deleted\n");
return 0;
}
}
}

for (struct planet *p1 = head; p1 != 0; p1 = p1->next)
{
for (struct planet *p3 = head; p3 != 0; p3 = p3->next)
{
//Collision logic
if(p1 != p3){
if(p1->mass >= p3->mass){
destroy(remove(p3)); //Does not cause an error
break;
}else{
destroy(remove(p1)); //Causes the error.
break;
//Deleting p1 here means the for loop can't move on
}
}
}
}

我正在寻找有关如何有效删除 p1 且不中断循环的一些建议。

非常感谢任何帮助,请原谅我不够干净的代码。

最佳答案

p1 被销毁时跳出内循环,不会跳出外循环,其中 p1 在被删除后被循环控制取消引用。

你可以用这样的代码来避免它。我不喜欢在链表中使用 for 循环,而 while 可以很容易地设置下一个链接。

struct planet *p1link, *p3link;

p1 = head;
while(p1 != NULL) {
p1link = p1->next; // collect next link now
p3 = p1->next; // avoid detecting B-A as well as A-B
while(p3 != NULL) {
p3link = p3->next; // collect next link now
//Collision logic
if(p1->mass >= p3->mass){
destroy(remove(p3));
} else {
destroy(remove(p1));
}
p3 = p3link; // next
}
p1 = p1link; // next
}

然而整个概念是有缺陷的,因为你删除的 p3 可能是下一个 p1 星球。所以我建议包括一个结构成员 pending 然后你再对列表进行一次解析,以删除死行星。

关于c++ - 遍历 LinkedList 时读取访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41502392/

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