提问人:Vishwa Mars 提问时间:11/8/2023 最后编辑:user207421Vishwa Mars 更新时间:11/8/2023 访问量:54
为什么此代码中出现错误错误异常 [重复]
why bad access error exception comes in this code [duplicate]
问:
为什么我的代码会抛出异常?
该代码定义了一个名为 Graph 的类,该类表示图形。图是由节点和边组成的数据结构。节点表示图形的顶点,边表示节点之间的连接。
Graph 类 具有以下成员:
array:节点数组。 size:图形的大小。 j:用于跟踪数组中下一个可用索引的计数器。 Graph 类提供以下方法:
addvertex():将顶点添加到图形中。 add_edge_no_direction():在图形中的两个顶点之间添加一条无向边。 display():显示图形。 main() 函数创建一个大小为 200 的新 Graph 对象。然后,它将五个顶点添加到图形中,并在顶点之间添加四个无向边。最后,它调用 display() 方法来显示图形
c
#include <iostream>
using namespace std;
struct node {
int data;
int weight;
node* next;
node() {}
node(int data, int weight) {
this->data = data;
next = nullptr;
this->weight = weight;
}
};
class Graph {
private:
node* array;
int size;
int j;
public:
Graph(int size) {
this->size = size;
array = new node[size];
j = 0;
for (int i = 0; i < size; i++) {
array[i].data = 0;
array[i].weight = 0;
array[i].next = nullptr;
}
}
bool addvertex(int value) {
for (int i = 0; i < size; i++) {
node* current = array[i].next;
while (current != nullptr) {
if (current->data == value) {
return false;
} else {
current = current->next;
}
}
}
node* newnode = new node(value, 0);
newnode->next = nullptr;
array[j].next = newnode;
j++;
return true;
}
bool add_edge_no_direction(int source, int destination, int weight) {
node* newnode1 = new node(source, weight);
node* newnode2 = new node(destination, weight);
// check if edge present
for (int i = 0; i < size; i++) {
if (array[i].data != source || array[i].data != destination) {
return false;
}
}
for (int i = 0; i < size; i++) {
node* current = array[i].next;
if (current->data == source || current->data == destination) {
if (current->next == nullptr) {
if (current->data == source) {
current->next = newnode2;
} else {
current->next = newnode1;
}
} else {
while (current->next != nullptr) {
current = current->next;
}
if (current->data == source) {
current->next = newnode2;
} else {
current->next = newnode1;
}
}
} else {
cout << "no way it comes here";
}
}
return true;
}
void display(){
for(int i=0;i<size;i++){
node* current=array[i].next;
cout<<current->data;
while(current){
cout<<"->";
current=current->next;
cout<<current->data;
}
}
}
};
int main() {
Graph g1(200);
g1.addvertex(1);
g1.addvertex(2);
g1.addvertex(3);
g1.addvertex(4);
g1.addvertex(5);
g1.add_edge_no_direction(1, 2, 100);
g1.add_edge_no_direction(1, 3, 150);
g1.add_edge_no_direction(1, 4, 200);
g1.add_edge_no_direction(1, 5, 250);
g1.display();
}
答:
1赞
ravenspoint
11/8/2023
#1
如果在调试器下运行代码,则会看到发生异常,因为未检查显示方法中的空指针。
遇到异常时,应始终使用调试器。
调试器是一个非常强大的工具,用于帮助诊断问题 程序。调试器可用于所有实际编程 语言。因此,能够使用调试器被认为是 任何专业或发烧友程序员的基本技能。并使用 调试器本身被认为是您应该自己完成的基本工作 在向他人寻求帮助之前。由于这个网站是为专业人士和 发烧友程序员,而不是帮助台或指导网站,如果你 对特定程序的问题有疑问,但尚未 使用调试器,您的问题很可能被关闭并且 投了反对票。如果你坚持这样的问题,你会 最终被阻止发布更多内容。
固定代码为:
void display()
{
for (int i = 0; i < size; i++)
{
node *current = array[i].next;
if (!current)
continue;
cout << current->data;
while (current)
{
cout << "->";
current = current->next;
if (!current)
break;
cout << current->data;
}
}
}
评论
1赞
ravenspoint
11/8/2023
您是否在调试器下运行了代码?这就是你帮助自己的方式。
0赞
Vishwa Mars
11/8/2023
我也想要这样的显示 1->2->3->4->5 2->1
0赞
ravenspoint
11/8/2023
stackoverflow.com/questions/25385173/......
0赞
Vishwa Mars
11/8/2023
你能发送更正后的代码吗,我已经尝试了 2 次 dat
3赞
ravenspoint
11/8/2023
最后一次:在调试器下运行代码,以便您可以自己修复它。您需要学习如何使用调试器 - 这是一项至关重要的技能。
评论
std::vector
new[]