2013-12-10 59 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#define MAX_SIZE 100 

我試圖快速排序基於從原點的距離2D點的數組,但我的代碼打第一scanfSeg 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); 

Sortpoints只是在取決於Point.dist

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值排序的Point structs陣列的快速排序的操作只是打印點在它們的距離的次序從原點

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; 
} 
+0

這是一段時間,因爲我重申了C中的運算符優先級...你可以用'&(pointa.x)'來嘗試嗎? – SJuan76

+0

嘿,謝謝你的回覆!剛剛嘗試過,不幸的是沒有運氣。 – user3088836

+0

@ SJuan76元素選擇運算符'.'比'&'的地址具有更高的優先級,並且首先運行。 – Atle

回答

1

當我改變了這一行:

scanf("(%lf,%lf)", &pointa.x, &pointa.y); 

要這樣:

scanf("%lf,%lf", &pointa.x, &pointa.y); 

的點值實際上被讀取,用括號沒有什麼被讀取,我不沒有看到關於這個scanf的文檔中的任何內容,是否有人熟悉這個?

您的排序代碼似乎進入無限遞歸併導致堆棧溢出,但是。

0

你的問題是你的大括號。我已經對您的分類點功能進行了重新格式化,所以每個基本塊的實際位置都更清晰。

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); 
} 

現在應該很明顯,您的段錯誤是意外無限遞歸的結果。對於使用{ }進行循環,這是一個很好的論點,即使只有一條語句。

1

我有堆棧溢出。

你的程序調用函數sortpoints,並且自己也調用它(sortpoints調用sortpoints)。但我不知道sortpoints必須停止!

因此,j-1變爲空,並且arr[j]根本無效。

+0

嘗試'如果(j> 1){在函數分類點下的內容}' – BalticMusicFan

相關問題