如何解决当我尝试在 c++
这是我的 DFS 函数。虽然我在主函数中分配了visited数组,但我不知道为什么visited[start_vertex]不起作用!
typedef Node** PtP;
void DFS(PtP list,int start_vertex,bool* visited)
{
cout << "the crash under this line";
if (visited[start_vertex])
{
cout << "ignore";
}
visited[start_vertex] = true;
Node* adj = list[start_vertex]; // linked list list[0]
// after this line start_vertex will be adjacency vertex of start vertex
while (adj != NULL)
{
DFS(list,adj->data,visited);
adj = adj->next;
}
}
这是我的主要功能,我创建了一个 bool 数组并通过四个元素分配了它并插入了 DFS 功能
int main()
{
PtP list;
list = new Node * [4];
for (int i = 0; i < 4; i++)
{
list[i] = new Node[4];
list[i] = NULL;
}
for (int i = 0; i < 4; i++)
{
cout << "enter number of vertices adjacency with " << i << ": ";
int temp;
cin >> temp;
addEdge2(list,i,temp);
}
for (int i = 0; i < 4; i++)
{
cout << "list[" << i << "]: ";
traverse(list[i]);
}
bool* visited = new bool[4];
for (int i = 0; i < 4; i++)
{
visited = false;
}
DFS(list,visited);
for (int i = 0; i < 4; i++)
{
cout << "visisted: " << visited[i] << " ";
}
for (int i = 0; i < 4; i++)
{
delete [] list[i];
}
delete [] list;
return 0;
}
这是我的整个程序,仅用于测试 DFS 方法:
#include <iostream>
using namespace std;
class Node {
public:
int data;
Node* next;
};
typedef Node* Ptr;
typedef Node** PtP;
void addFront(Ptr& First,int x)
{
Ptr p;
p = new Node;
p->data = x;
p->next = First;
First = p;
}
void addEdge(PtP &list,int v1,int v2)
{
addFront(list[v1],v2);
addFront(list[v2],v1);
}
void addEdge2(PtP& list,int v,int num_of_adj_vtex)
{
cout << "enter vertices adjacency with " << v << ": ";
int temp;
for (int i = 0; i < num_of_adj_vtex; i++)
{
cin >> temp;
addFront(list[v],temp);
}
}
void traverse(Node* first)
{
Node* p = first;
while (p != NULL)
{
cout << p->data<<" ";
p = p->next;
}
cout << "\n";
}
void DFS(PtP list,bool* visited)
{
if (visited[start_vertex])
{
cout << "vertex: " << start_vertex << " visited ";
}
visited[start_vertex] = true;
// linked list list[0] after this line start_vertex will be adjaceny vertex of start vertex
Node* adj = list[start_vertex];
while (adj != NULL)
{
DFS(list,visited);
adj = adj->next;
}
}
int main()
{
PtP list; //type def node ** ptp
list = new Node * [4];
for (int i = 0; i < 4; i++)
{
list[i] = NULL;
}
for (int i = 0; i < 4; i++)
{
cout << "enter number of vertices adjacency with " << i << ": ";
int temp;
cin >> temp;
addEdge2(list,temp);
}
for (int i = 0; i < 4; i++)
{
cout << "list[" << i << "]: ";
traverse(list[i]);
}
bool* visited = new bool[4];
for (int i = 0; i < 4; i++)
{
visited[i] = false;
}
DFS(list,visited);
for (int i = 0; i < 4; i++)
{
cout << "visisted: " << i << " "<< visited[i] << " ";
}
delete [] list;
return 0;
}
解决方法
好的,据我所知,问题似乎与用户输入有关。方法:
void addEdge2(PtP& list,int v,int num_of_adj_vtex)
{
cout << "enter vertices adjacency with " << v << ": ";
int temp;
for (int i = 0; i < num_of_adj_vtex; i++)
{
cin >> temp;
addFront(list[v],temp); //Here if temp > 3 your later code will fail.
}
}
请求用户输入并将其存储在列表的前面...无论 temp 的值是什么,并将其放入数据字段。
稍后当您执行 DFS
方法时,您会递归调用相同的方法:
DFS(list,adj->data,visited);
adj = adj->next;
这取决于 adj->data 存储了什么,来自 addEdge2 函数。由于您已将布尔数组的长度设置为 4,因此该 adj->data 必须指向任何大于 3 的值,这将引发您提到的错误,因为它正在尝试访问未分配的内存。
看起来代码没有错,确切地说,即使您可以设置一些保护措施,例如确保用户输入 0 到 3 之间的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。