意外的输出为零

时间:2017-12-27 12:50:58

标签: c++ linked-list

我是C ++新手,现在在单一链接列表上练习。不知何故,下面代码的输出始终为零。我认为问题是nextPoint方法但是我尝试更改引用/取消引用,它不起作用。

问题出在哪里?提前谢谢。

// Singly Linked List

#include <math.h>
#include <iostream>

class Point {

        public:
        double x, y;
        Point* next;

        // constructor
        Point (double x, double y) {
                this->x = x;
                this->y = y;
                this->next = NULL;
        }

        void nextPoint(Point nexti) {
                this->next = &nexti;
        }

        double dist(Point &a, Point &b) {
                double dx = a.x - b.x;
                double dy = a.y - b.y;
                return sqrt(dx*dx - dy*dy);
        }

        double length() {
                Point *iter = this;
                double len = 0.0;
                while (iter->next != NULL) {
                        len += dist(*iter, *iter->next);
                        iter = iter->next;
                }
                return len;
        }

};

int main() {

        Point p1(1,1);
        Point p2(2,2);
        Point p3(5,5);
        p1.nextPoint(p2);
        p2.nextPoint(p3);

        std::cout << p1.length() << std::endl;

        return 1;

}

2 个答案:

答案 0 :(得分:3)

请打开更多编译器警告,您可能会在nextPoint中发出警告,表示您正在永久存储临时变量(nexti)的地址(this->next中)。

您必须传递要添加的点的地址或引用。

void nextPoint(Point *nexti) {
    this->next = nexti;
}

p1.nextPoint(&p2);
p2.nextPoint(&p3);

void nextPoint(Point &nexti) {
    this->next = &nexti;
}

p1.nextPoint(p2);
p2.nextPoint(p3);

附注:请将NULL替换为nullptr

答案 1 :(得分:3)

您的代码存在两个问题:

  1. nextPoint按值获取其参数,这意味着您将存储该按值参数的地址,该参数在nextPoint的执行结束后立即变为无效。将其更改为接受Point &nexti

  2. 您的距离计算功能错误。您应该添加方块,而不是减去它们:return sqrt(dx*dx + dy*dy);

  3. 与您的问题无关,但有几种方法可以改进您的代码:

    • 使用构造函数中的mem-initialiser列表初始化成员,而不是为其分配。这是一个很好的习惯,因为一旦你开始处理初始化和赋值大不相同的事情(引用,类,......),这将是有用的。

      Point (double x, double y) : x(x), y(y), next(nullptr)
      {}
      
    • 使用nullptr代替NULL,因为后者不是类型安全的。

    • length应标记为const,因为它不会修改其所调用的对象。请注意,iter同样已更改为const Point *

      double length() const {
              const Point *iter = this;
              double len = 0.0;
              while (iter->next != NULL) {
                      len += dist(*iter, *iter->next);
                      iter = iter->next;
              }
              return len;
      }
      
    • dist根本不使用this,因此它可以(并且应该)成为static成员函数。此外,它应该使用const &的参数,因为它不会修改它们:

      static double dist(const Point &a, const Point &b) {
              double dx = a.x - b.x;
              double dy = a.y - b.y;
              return sqrt(dx*dx - dy*dy);
      }