#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// Storing two 2D points and their distance.
typedef struct PointPair_t
{
double x1, y1, x2, y2, dist;
}PointPair, *PPointPair;
// Storing pointer to PointPair in a linked list.
typedef struct PointPairNode_t
{
PPointPair value;
struct PointPairNode_t *next;
}PointPairNode, *PPointPairNode;
double distance(double x1, double y1, double x2, double y2)
{
double dx = x2 - x1;
double dy = y2 - y1;
return sqrt((dx
* dx
) + (dy
* dy
)); }
// Sort array of pointer to PointPair using insertion sort.
void sortPointPairByDistance(PPointPair *arr, unsigned int count)
{
int top = count - 2;
int i;
while(top >= 0)
{
PPointPair temp = arr[top];
for(i = top; i < count - 1; ++i)
{
if(arr[i + 1]->dist >= temp->dist)
break;
arr[i] = arr[i + 1];
}
arr[i] = temp;
--top;
}
}
int main(int argc, char *argv[])
{
PPointPairNode list = NULL;
unsigned int pointPairCount = 0;
PPointPair *arr = NULL;
int i;
PPointPairNode listPtr;
FILE *fp;
//fp = fopen("point.txt", "r");
fp = stdin;
if(fp)
{
{
double x1, y1, x2, y2;
if(fscanf(fp
, "%lf %lf %lf %lf", &x1
, &y1
, &x2
, &y2
) == 4) {
// Allocate a node and a PointPair to store points and distances.
PPointPairNode node
= (PPointPairNode
)malloc(sizeof(PointPairNode
)); node
->value
= (PPointPair
)malloc(sizeof(PointPair
)); node->value->x1 = x1;
node->value->y1 = y1;
node->value->x2 = x2;
node->value->y2 = y2;
node->value->dist = distance(x1, y1, x2, y2);
node->next = list;
list = node;
++pointPairCount;
printf("Pair %u : { (%5.2lf, %5.2lf), (%5.2lf, %5.2lf) } distance : %9.6lf\n", pointPairCount, x1, y1, x2, y2, node->value->dist);
}
}
}
// Allocate an array and copy pointers into it for sorting.
arr
= (PPointPair
*)malloc(pointPairCount
* sizeof(PPointPair
)); for(i = pointPairCount - 1, listPtr = list; i >= 0; --i, listPtr = listPtr->next)
{
arr[i] = listPtr->value;
}
sortPointPairByDistance(arr, pointPairCount);
//fp = fopen("point2.txt", "w");
fp = stdout;
if(fp)
{
for(i = 0; i < pointPairCount; ++i)
{
fprintf(fp
, "%lf %lf %lf %lf\n", arr
[i
]->x1
, arr
[i
]->y1
, arr
[i
]->x2
, arr
[i
]->y2
); }
}
// Free memory.
while(list)
{
listPtr = list->next;
list = listPtr;
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCi8vIFN0b3JpbmcgdHdvIDJEIHBvaW50cyBhbmQgdGhlaXIgZGlzdGFuY2UuCnR5cGVkZWYgc3RydWN0IFBvaW50UGFpcl90CnsKICAgIGRvdWJsZSB4MSwgeTEsIHgyLCB5MiwgZGlzdDsKfVBvaW50UGFpciwgKlBQb2ludFBhaXI7CgovLyBTdG9yaW5nIHBvaW50ZXIgdG8gUG9pbnRQYWlyIGluIGEgbGlua2VkIGxpc3QuCnR5cGVkZWYgc3RydWN0IFBvaW50UGFpck5vZGVfdAp7CglQUG9pbnRQYWlyIHZhbHVlOwoJc3RydWN0IFBvaW50UGFpck5vZGVfdCAqbmV4dDsKfVBvaW50UGFpck5vZGUsICpQUG9pbnRQYWlyTm9kZTsKCmRvdWJsZSBkaXN0YW5jZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpCnsKCWRvdWJsZSBkeCA9IHgyIC0geDE7Cglkb3VibGUgZHkgPSB5MiAtIHkxOwoJcmV0dXJuIHNxcnQoKGR4ICogZHgpICsgKGR5ICogZHkpKTsKfQoKLy8gU29ydCBhcnJheSBvZiBwb2ludGVyIHRvIFBvaW50UGFpciB1c2luZyBpbnNlcnRpb24gc29ydC4Kdm9pZCBzb3J0UG9pbnRQYWlyQnlEaXN0YW5jZShQUG9pbnRQYWlyICphcnIsIHVuc2lnbmVkIGludCBjb3VudCkKewoJaW50IHRvcCA9IGNvdW50IC0gMjsKCWludCBpOwoKCXdoaWxlKHRvcCA+PSAwKQoJewoJCVBQb2ludFBhaXIgdGVtcCA9IGFyclt0b3BdOwoJCWZvcihpID0gdG9wOyBpIDwgY291bnQgLSAxOyArK2kpCgkJewoJCQlpZihhcnJbaSArIDFdLT5kaXN0ID49IHRlbXAtPmRpc3QpCgkJCQlicmVhazsKCQkJYXJyW2ldID0gYXJyW2kgKyAxXTsKCQl9CgkJYXJyW2ldID0gdGVtcDsKCQktLXRvcDsKCX0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJUFBvaW50UGFpck5vZGUgbGlzdCA9IE5VTEw7Cgl1bnNpZ25lZCBpbnQgcG9pbnRQYWlyQ291bnQgPSAwOwoJUFBvaW50UGFpciAqYXJyID0gTlVMTDsKCWludCBpOwoJUFBvaW50UGFpck5vZGUgbGlzdFB0cjsKCglGSUxFICpmcDsKCgkvL2ZwID0gZm9wZW4oInBvaW50LnR4dCIsICJyIik7CglmcCA9IHN0ZGluOwoJaWYoZnApCgl7CgkJd2hpbGUoIWZlb2YoZnApKQoJCXsKCQkJZG91YmxlIHgxLCB5MSwgeDIsIHkyOwoJCQlpZihmc2NhbmYoZnAsICIlbGYgJWxmICVsZiAlbGYiLCAmeDEsICZ5MSwgJngyLCAmeTIpID09IDQpCgkJCXsKCQkJCS8vIEFsbG9jYXRlIGEgbm9kZSBhbmQgYSBQb2ludFBhaXIgdG8gc3RvcmUgcG9pbnRzIGFuZCBkaXN0YW5jZXMuCgkJCQlQUG9pbnRQYWlyTm9kZSBub2RlID0gKFBQb2ludFBhaXJOb2RlKW1hbGxvYyhzaXplb2YoUG9pbnRQYWlyTm9kZSkpOwoJCQkJbm9kZS0+dmFsdWUgPSAoUFBvaW50UGFpciltYWxsb2Moc2l6ZW9mKFBvaW50UGFpcikpOwoJCQkJbm9kZS0+dmFsdWUtPngxID0geDE7CgkJCQlub2RlLT52YWx1ZS0+eTEgPSB5MTsKCQkJCW5vZGUtPnZhbHVlLT54MiA9IHgyOwoJCQkJbm9kZS0+dmFsdWUtPnkyID0geTI7CgkJCQlub2RlLT52YWx1ZS0+ZGlzdCA9IGRpc3RhbmNlKHgxLCB5MSwgeDIsIHkyKTsKCQkJCW5vZGUtPm5leHQgPSBsaXN0OwoJCQkJbGlzdCA9IG5vZGU7CgkJCQkrK3BvaW50UGFpckNvdW50OwoJCQkJcHJpbnRmKCJQYWlyICV1IDogeyAoJTUuMmxmLCAlNS4ybGYpLCAoJTUuMmxmLCAlNS4ybGYpIH0gIGRpc3RhbmNlIDogJTkuNmxmXG4iLAoJCQkJCXBvaW50UGFpckNvdW50LCB4MSwgeTEsIHgyLCB5Miwgbm9kZS0+dmFsdWUtPmRpc3QpOwoJCQl9CgkJfQoJCWZjbG9zZShmcCk7Cgl9CgoJLy8gQWxsb2NhdGUgYW4gYXJyYXkgYW5kIGNvcHkgcG9pbnRlcnMgaW50byBpdCBmb3Igc29ydGluZy4KCWFyciA9IChQUG9pbnRQYWlyICopbWFsbG9jKHBvaW50UGFpckNvdW50ICogc2l6ZW9mKFBQb2ludFBhaXIpKTsKCWZvcihpID0gcG9pbnRQYWlyQ291bnQgLSAxLCBsaXN0UHRyID0gbGlzdDsgaSA+PSAwOyAtLWksIGxpc3RQdHIgPSBsaXN0UHRyLT5uZXh0KQoJewoJCWFycltpXSA9IGxpc3RQdHItPnZhbHVlOwoJfQoKCXNvcnRQb2ludFBhaXJCeURpc3RhbmNlKGFyciwgcG9pbnRQYWlyQ291bnQpOwoKCS8vZnAgPSBmb3BlbigicG9pbnQyLnR4dCIsICJ3Iik7CglmcCA9IHN0ZG91dDsKCWlmKGZwKQoJewoJCWZvcihpID0gMDsgaSA8IHBvaW50UGFpckNvdW50OyArK2kpCgkJewoJCQlmcHJpbnRmKGZwLCAiJWxmICVsZiAlbGYgJWxmXG4iLCBhcnJbaV0tPngxLCBhcnJbaV0tPnkxLCBhcnJbaV0tPngyLCBhcnJbaV0tPnkyKTsKCQl9CgkJZmNsb3NlKGZwKTsKCX0KCgkvLyBGcmVlIG1lbW9yeS4KCWZyZWUoYXJyKTsKCXdoaWxlKGxpc3QpCgl7CgkJbGlzdFB0ciA9IGxpc3QtPm5leHQ7CgkJZnJlZShsaXN0LT52YWx1ZSk7CgkJZnJlZShsaXN0KTsKCQlsaXN0ID0gbGlzdFB0cjsKCX0KCglyZXR1cm4gMDsKfQo=