【发布时间】:2016-04-18 19:05:37
【问题描述】:
我正在尝试根据点到原点的距离对点的链接列表进行排序。越接近点,它应该是链表中的第一个/下一个。示例:如果用户输入 (2,2) (4,4) (1,1) (3,3),则应使用指向 (1,1) (2,2) (3, 3) (4,4)。它的工作原理是 main 中的点不受排序的影响并且这些点不会互换,因此如果 (1,1) 像示例中一样是第三个,它将是第二次循环中的最小点,与(4,4)。
#include <iostream>
#include <math.h>
using namespace std;
class List {
public:
int x;
int y;
List *next;
};
void init(List *root) {
int x, y;
List *traverse;
traverse = root;
while(traverse != 0) {
cout<<"Enter coordinate x: ";
cin>>x;
traverse->x = x;
cout<<"Enter coordinate y: ";
cin>>y;
traverse->y = y;
traverse = traverse->next;
}
}
void display(List *root) {
List *traverse;
traverse = root;
while(traverse->next != 0) {
cout<<"("<<traverse->x<<","<<traverse->y<<") ";
traverse = traverse->next;
}
cout<<"("<<traverse->x<<","<<traverse->y<<")"<<endl;
}
void sort(List *root, int n) {
List *traverse;
List *stable;
traverse = root;
stable = root;
double d1, d2;
for(int i = 0; i < n; i++) {
d1 = sqrt(pow(traverse->x, 2) + pow(traverse->y, 2));
d2 = sqrt(pow(stable->x, 2) + pow(stable->y, 2));
if(d1 < d2) {
root = traverse;
}
traverse = traverse->next;
}
}
void collinear(List *root) {
int x[3] = {0}, y[3] = {0};
int value;
List *traverse;
traverse = root;
for(int i = 0; i < 3; i++) {
if(traverse != 0) {
x[i] = traverse->x;
y[i] = traverse->y;
traverse = traverse->next;
}
}
if(x[2] != 0) {
value = x[0] * (y[1] - y[2]) + x[1] * (y[2] - y[0]) + x[2] * (y[0] - y[1]);
if(value == 0) {
traverse = root;
for(int i = 0; i < 3; i++) {
cout<<"("<<traverse->x<<","<<traverse->y<<") ";
traverse = traverse->next;
}
cout<<"collinear!"<<endl;
}
else {
traverse = root;
for(int i = 0; i < 3; i++) {
cout<<"("<<traverse->x<<","<<traverse->y<<") ";
traverse = traverse->next;
}
cout<<"non-collinear!"<<endl;
}
}
else {
cout<<"Not a group of 3 points cannot calculate collinearity!"<<endl;
}
}
int main() {
List *root;
root = new List;
List *traverse;
traverse = root;
List *node1;
node1 = new List;
List *node2;
node2 = new List;
List *node3;
node3 = new List;
root->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = 0;
init(traverse);
display(traverse);
/*for(int i = 0; i < 2; i++) {
collinear(traverse);
traverse = traverse->next;
}
traverse = root;*/
traverse = root;
int n = 4;
for(int i = 0; i < 4; i++) {
List *traverse2;
traverse2 = traverse;
sort(traverse2, n);
traverse = traverse->next;
n--;
}
traverse = root;
display(traverse);
return 0;
}
【问题讨论】:
-
如果你有 (1,4) (3,1) (2,2) 和 (1,1) 你想做什么?
-
如果您希望能够更改根节点,请将
void sort(List *root, int n)替换为void sort(List *&root, int n)。 -
如果要对链表进行排序,Wiki 有 linked list merge sort 的示例伪代码。
标签: c++ sorting linked-list