如何解决为什么当我从 root 重新初始化它时我的指针指向 null
我会尽量保持简单。
基本上,我正在处理图形并为最小生成树编写 Kruskal 算法。我做了一类森林,每个森林节点包含一个链表,其头部代表图的一个顶点,前向连接节点包含主头部顶点所连接的顶点,下一个森林节点包含图的下一个顶点图,并且该森林节点中的链接列表包含特定顶点所连接的顶点。
到目前为止,我的代码是 400 行。我将分享一个包含问题的片段:
#include <iostream>
using namespace std;
class node
{
public:
int data;
node* right;
node()
{
data = 0;
right = NULL;
}
~node()
{
cout << data << " node has been destroyed " << endl;
}
};
class forest
{
public:
node* vertices;
int weight;
forest* next;
forest()
{
vertices = NULL;
weight = 0;
next = NULL;
}
~forest()
{
cout << vertices->data << " vertice has been destroyed " << endl;
}
};
class que
{
public:
int root;
int connected;
int weight;
int set_no; // for checking of disjoint sets
que* next;
que()
{
root = 0;
connected = 0;
weight = 0;
set_no = 0;
next = NULL;
}
~que()
{
cout << "edge with root " << root << " connected to " << connected << " has been dequed " << endl;
}
};
que* priority_dq(que*& front)
{
que* move = front;
que* link = front;
que* required = new que;
required = move;
while (move->next != NULL)
{
if (required->weight > move->next->weight)
{
link = move;
required = move->next;
}
move = move->next;
}
if (link == front)
{
front = front->next;
link->next = NULL;
}
else
{
link->next = required->next;
}
return required;
}
void make_spanning_tree(forest*& root,que*& front,int count)
{
que* use;
forest* sets = new forest; // we using forest here bcz the data structure of its members is according to the dynamically changing disjoint set structure we need
int set_no = 1; // each forest node 's vertices will contain 1 set's members
node* move = new node;
forest* iterate;
//forest* start ;
for (int i = 0; i < count; i++)
{
iterate = sets;
use = priority_dq(front);
if (iterate->vertices->data == 0)
{
iterate->vertices->data = use->root;
node* add = new node;
add->data = use->connected;
iterate->vertices->right = add;
}
else
{
int* r_count = new int[set_no],* c_count = new int[set_no];
int new_r = 1,new_c = 1;
for (int j = 0; j < set_no; j++)
{
r_count[j] = 0;
c_count[j] = 0;
move = iterate->vertices;
while (move != NULL)
{
if (use->root == move->data)
{
r_count[j] = 1;
new_r = 0;
}
if (use->connected == move->data)
{
c_count[j] = 1;
new_c = 0;
}
move = move->right;
}
iterate = iterate->next;
}
}
}
iterate = sets;
while (iterate != NULL)
{
move = iterate->vertices;
while (move != NULL)
{
cout << move->data << " ";
move = move->right;
}
cout << endl;
iterate = iterate->next;
}
}
int main()
{
forest* root = new forest;
forest* temp = root;
int a;
cout << "enter the vertices for the graph and enter -1 to stop" << endl;
cin >> a;
while (a != -1)
{
temp = root;
if (temp->vertices == NULL)
{
node* join = new node;
join->data = a;
temp->vertices = join;
}
else
{
while (temp->next != NULL)
{
temp = temp->next;
}
node* join = new node;
join->data = a;
forest* add = new forest;
add->vertices = join;
temp->next = add;
}
cin >> a;
}
que* front = new que;
int count = 1,from,to;
cout << "Now enter the edges(atleast 3) present in the graph and their respective weights.To stop enter -1 " << endl;
cout << "what is the root of edge no " << count << " ? ";
cin >> from;
while (from != -1)
{
forest* check;
check = root;
int is_vertice = 0;
while (check != NULL)
{
if (check->vertices->data == from)
{
is_vertice = 1;
}
check = check->next;
}
if (is_vertice == 0)
{
cout << "sorry vertice is not present in graph,try an exsisting one " << endl;
}
else
{
cout << "\nwhat is it connected to ? ";
cin >> to;
while (to != -1)
{
check = root;
is_vertice = 0;
while (check != NULL)
{
if (check->vertices->data == to)
{
is_vertice = 1;
}
check = check->next;
}
if (is_vertice == 0)
{
cout << "sorry vertice is not present in graph,try an exsisting one or enter -1 to stop" << endl;
cin >> to;
}
else
{
if (front->root == 0)
{
front->root = from;
front->connected = to;
cout << "enter the weight of this edge" << endl;
cin >> to;
front->weight = to;
count++;
break;
}
else
{
que* add = new que;
add->root = from;
add->connected = to;
cout << "enter the weight of this edge" << endl;
cin >> to;
add->weight = to;
add->next = front;
front = add;
count++;
break;
}
}
}
}
cout << "enter next vertice root for edge no " << count << " or enter -1 to stop " << endl;
cin >> from;
}
que* move = front;
cout << "EDGES: " << endl;
while (move != NULL)
{
cout << "from " << move->root << " to " << move->connected << ",weight: " << move->weight << endl;
move = move->next;
}
move = priority_dq(front);
cout <<endl<< "minimum weight edge" << endl;
cout << endl << "from " << move->root << " to " << move->connected << ",weight: " << move->weight << endl << endl;
move = front;
cout << endl << "que afterwards" << endl;
while (move != NULL)
{
cout << "from " << move->root << " to " << move->connected << ",weight: " << move->weight << endl;
move = move->next;
}
cout << endl << "SETS:" << endl;
make_spanning_tree(root,front,count);
}
这里要关注的主要问题是,在我的生成树函数中,第一个 for
检查中的第一个 if
循环(我正在阅读 iterate->vertice->data
的位置)告诉我iterate
包含与以下移动相同的空值。所以,这意味着我的第一次迭代通过使用第一个 if
没问题,然后在第二个循环迭代中,我的 else
部分被使用,其中 move 指向 null,现在在第三个(最有可能) 它说 iterate->vertices
具有与移动相同的值 null 。这没有任何意义,因为我用 iterate
重新初始化 sets
,它是根或头,它永远不能为空,因为我没有删除我的主要对象,而且我希望每次都从头开始再次读取我的支票。
我不明白为什么它仍然指向上次迭代中的以下空值。
解决方法
我运行了你的程序,它在 iterate->vertices->data
的第一个 make_spanning_tree
中抛出异常,说 iterate->vertices
是 nullptr
。
您说您使用 iterate
重新初始化 sets
,它是根或头,但似乎 sets
是 new forest
,它具有 {{1} } 作为 nullptr
,而不是 root。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。