Implement
This commit is contained in:
		
							
								
								
									
										133
									
								
								src/Tour.cpp
									
									
									
									
									
								
							
							
						
						
									
										133
									
								
								src/Tour.cpp
									
									
									
									
									
								
							@@ -4,47 +4,130 @@
 | 
				
			|||||||
// Also remove these comments here and add your own.
 | 
					// Also remove these comments here and add your own.
 | 
				
			||||||
// TODO: remove this comment header
 | 
					// TODO: remove this comment header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <iostream>
 | 
					 | 
				
			||||||
#include "Tour.h"
 | 
					#include "Tour.h"
 | 
				
			||||||
#include "Node.h"
 | 
					#include "Node.h"
 | 
				
			||||||
#include "Point.h"
 | 
					#include "Point.h"
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tour::Tour()
 | 
					Tour::Tour() : m_startNode(nullptr) {}
 | 
				
			||||||
{
 | 
					
 | 
				
			||||||
    // TODO: write this member
 | 
					Tour::~Tour() {
 | 
				
			||||||
 | 
					    if (m_startNode == nullptr)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Node *node = m_startNode;
 | 
				
			||||||
 | 
					    if (node->next == m_startNode) {
 | 
				
			||||||
 | 
					        delete node;
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tour::~Tour()
 | 
					    do {
 | 
				
			||||||
{
 | 
					        Node *next = node->next;
 | 
				
			||||||
    // TODO: write this member
 | 
					        delete node;
 | 
				
			||||||
 | 
					        node = next;
 | 
				
			||||||
 | 
					    } while (node != m_startNode);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tour::show()
 | 
					void Tour::show() const {
 | 
				
			||||||
{
 | 
					    if (m_startNode == nullptr)
 | 
				
			||||||
    // TODO: write this member
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Node *node = m_startNode;
 | 
				
			||||||
 | 
					    do {
 | 
				
			||||||
 | 
					        Point &p = node->point;
 | 
				
			||||||
 | 
					        // I'm not using std::endl here to avoid flushing stdout for every
 | 
				
			||||||
 | 
					        // iteration.
 | 
				
			||||||
 | 
					        std::cout << '(' << p.x << ", " << p.y << ")\n";
 | 
				
			||||||
 | 
					        node = node->next;
 | 
				
			||||||
 | 
					    } while (node != m_startNode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Finally, flush!
 | 
				
			||||||
 | 
					    std::flush(std::cout);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tour::draw(QGraphicsScene *scene)
 | 
					void Tour::draw(QGraphicsScene *scene) const {
 | 
				
			||||||
{
 | 
					    if (m_startNode == nullptr)
 | 
				
			||||||
    // TODO: write this member
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Node *node = m_startNode;
 | 
				
			||||||
 | 
					    do {
 | 
				
			||||||
 | 
					        node->point.drawTo(node->next->point, scene);
 | 
				
			||||||
 | 
					        node = node->next;
 | 
				
			||||||
 | 
					    } while (node != m_startNode);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int Tour::size()
 | 
					int Tour::size() const {
 | 
				
			||||||
{
 | 
					    if (m_startNode == nullptr)
 | 
				
			||||||
    // TODO: write this member
 | 
					        return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int count = 0;
 | 
				
			||||||
 | 
					    Node *node = m_startNode;
 | 
				
			||||||
 | 
					    do {
 | 
				
			||||||
 | 
					        count++;
 | 
				
			||||||
 | 
					        node = node->next;
 | 
				
			||||||
 | 
					    } while (node != m_startNode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return count;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
double Tour::distance()
 | 
					double Tour::distance() const {
 | 
				
			||||||
{
 | 
					    if (m_startNode == nullptr)
 | 
				
			||||||
    // TODO: write this member
 | 
					        return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    double totalDistance = 0;
 | 
				
			||||||
 | 
					    Node *node = m_startNode;
 | 
				
			||||||
 | 
					    do {
 | 
				
			||||||
 | 
					        totalDistance += node->point.distanceTo(node->next->point);
 | 
				
			||||||
 | 
					        node = node->next;
 | 
				
			||||||
 | 
					    } while (node != m_startNode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return totalDistance;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tour::insertNearest(Point p)
 | 
					void Tour::insertNearest(Point p) {
 | 
				
			||||||
{
 | 
					    if (m_startNode == nullptr) {
 | 
				
			||||||
    // TODO: write this member
 | 
					        m_startNode = new Node(p);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Tour::insertSmallest(Point p)
 | 
					    Node *nearest = m_startNode;
 | 
				
			||||||
{
 | 
					    double minDistance = INFINITY;
 | 
				
			||||||
    // TODO: write this member
 | 
					
 | 
				
			||||||
 | 
					    Node *node = m_startNode;
 | 
				
			||||||
 | 
					    do {
 | 
				
			||||||
 | 
					        double currentDistance = node->point.distanceTo(p);
 | 
				
			||||||
 | 
					        if (currentDistance < minDistance) {
 | 
				
			||||||
 | 
					            minDistance = currentDistance;
 | 
				
			||||||
 | 
					            nearest = node;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        node = node->next;
 | 
				
			||||||
 | 
					    } while (node != m_startNode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    auto *newNode = new Node(p, nearest->next);
 | 
				
			||||||
 | 
					    nearest->next = newNode;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Tour::insertSmallest(Point p) {
 | 
				
			||||||
 | 
					    if (m_startNode == nullptr) {
 | 
				
			||||||
 | 
					        m_startNode = new Node(p);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Node *bestNode = m_startNode;
 | 
				
			||||||
 | 
					    double minIncrease = INFINITY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Node *node = m_startNode;
 | 
				
			||||||
 | 
					    do {
 | 
				
			||||||
 | 
					        double increase = node->point.distanceTo(p) +
 | 
				
			||||||
 | 
					                          p.distanceTo(node->next->point) -
 | 
				
			||||||
 | 
					                          node->point.distanceTo(node->next->point);
 | 
				
			||||||
 | 
					        if (increase < minIncrease) {
 | 
				
			||||||
 | 
					            minIncrease = increase;
 | 
				
			||||||
 | 
					            bestNode = node;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        node = node->next;
 | 
				
			||||||
 | 
					    } while (node != m_startNode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    auto *newNode = new Node(p, bestNode->next);
 | 
				
			||||||
 | 
					    bestNode->next = newNode;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								src/Tour.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/Tour.h
									
									
									
									
									
								
							@@ -15,15 +15,15 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Tour();
 | 
					    Tour();
 | 
				
			||||||
    ~Tour();
 | 
					    ~Tour();
 | 
				
			||||||
    void show();
 | 
					    void show() const;
 | 
				
			||||||
    void draw(QGraphicsScene* scene);
 | 
					    void draw(QGraphicsScene* scene) const;
 | 
				
			||||||
    int size();
 | 
					    int size() const;
 | 
				
			||||||
    double distance();
 | 
					    double distance() const;
 | 
				
			||||||
    void insertNearest(Point p);
 | 
					    void insertNearest(Point p);
 | 
				
			||||||
    void insertSmallest(Point p);
 | 
					    void insertSmallest(Point p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
 | 
					    Node* m_startNode;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // TOUR_H
 | 
					#endif // TOUR_H
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user