У меня есть проект, в котором я реализую алгоритм кратчайшего пути Дейкстры с использованием классов C ++. Он использует OpenGL, но это, безусловно, отдельно от моих проблем. Мне нужно немного понять, что я делаю неправильно в моем методе класса Дейкстры. Вот мой соответствующий код:
class Node {
public:
GLfloat x, y, z;
int numLinks;
Node *link1;
Node *link2;
GLfloat distance;
Node *previous;
Node(GLfloat x, GLfloat y, Node *link1, Node *link2);
Node(GLfloat x, GLfloat y, Node *link1);
Node();
Node(GLfloat x, GLfloat y);
~Node();
bool dijkstra(Node* graph[], Node *source, Node *target); //returns true if a path to target is found
int dist(Node &n1, Node &n2);
};
int Node::dist(Node &n1, Node &n2) {
GLfloat d = sqrt((pow((n2.x - n1.x), 2)) + (pow((n2.y - n1.y), 2)));
return d;
}
bool Node::dijkstra(Node* graph[], Node *source, Node *target) {
queue<Node> q;
int i;
for (i = 0; i < NUM_NODES; i++) {
graph[i]->distance = INFIN;
}
source->distance = 0;
i = 0;
q.push(*source);
while (!q.empty()) {
Node temp = q.front();
GLfloat d1 = dist(temp, temp->link1);
GLfloat d2 = dist(temp, temp->link2);
temp.link1.distance = d1;
temp.link1.distance = d2;
GLfloat alt = temp.distance + temp->link1.distance;
if (alt < temp->link1.distance) {
temp->link1.distance = alt;
temp->previous = temp;
}
alt = temp->distance + temp->link2->distance;
if (alt < temp->link2->distance) {
temp->link2->distance = alt;
temp->previous = temp;
}
if(d1 > d2) {
q.push(temp->link2);
q.push(temp->link1);
} else {
q.push(temp->link1);
q.push(temp->link2);
}
q.pop();
i++;
}
return true;
}
Я предполагаю, что я использую "->" и "." операторы все неправильно. Я получаю много таких ошибок, когда пытаюсь скомпилировать:
error: base operand of ‘->’ has non-pointer type ‘Node’
Моя реализация алгоритма Дейкстры несколько модифицирована для удовлетворения моих потребностей и, вероятно, ошибочна, но мне нужно это скомпилировать, чтобы я мог отладить его.
Указанный код - единственный код, вызывающий у меня горе, но если вы хотите увидеть другую его часть, просто спросите. Будем весьма благодарны за хорошее объяснение того, что я делаю неправильно.