【发布时间】:2013-12-10 22:32:55
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 100
我正在尝试根据与原点的距离对二维点数组进行快速排序,但我的代码在第一个 scanf 之后命中了 Seg fault。
typedef struct point{
double x;
double y;
double dist;
} point;
void sortpoints(point arr[], int low, int high);
void printpoints(point arr[], int n);
排序点只是一个快速排序的操作,它根据Point.dist 的值对Point structs 的数组进行排序
void sortpoints(point arr[], int low, int high){
int piv, i, j;
piv = low;
i = low;
j = high;
point box;
if(low < high){
while(i<j){
while((arr[i].dist)<=(arr[piv].dist) && i<= high)
i++;
}
while((arr[j].dist) > (arr[piv].dist) && j>= low)
j--;
}
if(i<j){
box = arr[i];
arr[i] = arr[j];
arr[j] = box;
}
box = arr[j];
arr[j] = arr[piv];
arr[piv] = box;
sortpoints(arr, low, j-1);
sortpoints(arr, j+1, high);
}
Printpoints 只是按照与原点的距离顺序打印点
void printpoints(point arr[], int n){
int i; for(i = 0; i <= n; i++){
printf("(%.2lf, %.2lf)\n", arr[i].x, arr[i].y);
}
}
用户在表格(point.x,point.y)中输入点数和点值
int main(){
point pointa;
point pointarray[MAX_SIZE];
int n=0;
printf("how many points would you like to enter?\n");
scanf("%d", &n);
if(n<MAX_SIZE){
int i;
for(i=0; i<n ; i++){
scanf("(%lf,%lf)", &pointa.x, &pointa.y);
pointa.dist = sqrt(pointa.x*pointa.x + pointa.y*pointa.y);
pointarray[i] = pointa;
}
sortpoints(pointarray, 0, n-1);
printpoints(pointarray, n);}
else{
printf("sorry, not a valid array size\n");
}
return 0;
}
【问题讨论】:
-
我已经有一段时间没有重新通过 C 中的运算符优先级了...你可以试试
&(pointa.x)吗? -
您好,谢谢您的回复!刚刚尝试过,不幸的是没有运气。
-
@SJuan76 元素选择运算符
.的优先级高于&的地址,并首先运行。