我试图在不使用STL的情况下解决算法问题。 但是在函数DFS中发生错误,调试器说“ w”是0xcccccc ........ 我该如何解决这个问题?????
#include<iostream>
#include<malloc.h>
#define MAX 1000
using namespace std;
bool visited[MAX];
typedef struct Queue
{
int rear;
int front;
int queue[MAX];
Queue()
{
rear = -1;
front = -1;
}
int pop()
{
if (rear == front)
return -1;
front = (front + 1) % MAX;
return queue[front];
}
void push(int data)
{
rear = (rear + 1) % MAX;
if (rear == front)
return;
queue[rear] = data;
}
}Queue;
typedef struct NODE
{
int data;
struct NODE* link;
NODE()
{
data = -1;
link = NULL;
}
}NODE;
typedef struct Graph
{
NODE*g[MAX] ;
void insert(int u, int v)
{
if (g[u] != NULL)
{
NODE*tmp = (NODE*)malloc(sizeof(NODE));
tmp->data = v;
tmp->link = g[u];
g[u] = tmp;
}
if (g[v] != NULL)
{
NODE*tmp = (NODE*)malloc(sizeof(NODE));
tmp->data = u;
tmp->link = g[v];
g[v] = tmp;
}
if (g[u] == NULL)
{
NODE*tmp = (NODE*)malloc(sizeof(NODE));
tmp->data = v;
tmp->link = NULL;
g[u] = tmp;
}
if (g[v] == NULL)
{
NODE*tmp = (NODE*)malloc(sizeof(NODE));
tmp->data = u;
tmp->link = NULL;
g[v] = tmp;
}
}
}Graph;
void DFS(NODE*g[], int start)
{
visited[start] = true;
cout << start << '\n';
for (NODE*w = g[start]; w; w = w->link)
{
if (!visited[w->data])
{
visited[w->data] = true;
DFS(g, w->data);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(false);
int n, m, v;
cin >> n >> m >> v;
Graph graph;
Queue q;
while (m-- > 0)
{
int u, v;
cin >> u >> v;
graph.insert(u, v);
}
DFS(graph.g, 1);
}
我试图在不使用STL的情况下解决算法问题。 但是在函数DFS中发生错误,调试器说“ w”是0xcccccc ........ 我该如何解决这个问题?????
答案 0 :(得分:2)
您可以通过使用调试器逐步执行代码,或者有时通过添加某种形式的日志记录来解决此类问题。您应该检查在编写代码时认为应该是什么情况,实际上是在执行代码期间发现情况。
在此示例中,如果您认为w
不应为0xcccccc,那么您想调查w
的来源以及为什么未将其设置为正确的值。您将继续向后遵循逻辑链,直到找到第一个点,程序没有按照您的预期去做,这就是您的错误。
答案 1 :(得分:2)
这里至少有两个问题:
g
,因此它充满了垃圾malloc
创建了新结构。它永远不会被调用。使用new
,因为它是c ++ 做这些typedef struct
事情也是非c ++的。只需使用struct X
。您可能想使用类而不是结构。感觉就像将C代码复制到C ++中。
使用调试器的建议是合理的。逐行运行您的代码。同时将您的编译器警告最大化。
我也建议您使用更好的代码样式,使用更多的空格(例如NODE *variable
和...} name
,函数之间的空行等以提高可读性,尤其是在向他人展示代码时。