2013-07-11 24 views
1

排序元素我有一個結構:在結構

struct points{ 
int i; 
int x; 
int y; 
}; 

我提出的結構的陣列,並把元素它。 i元素表示某個點的標籤。假設我有1 2 3作爲數組中的一個輸入。 1對應於點(2,3)的標籤。然後我嘗試對x元素進行排序:

for (a=0; a < i; a++){ 
        for (b = 0; b < i; b++){ 
         if (pt[b].x > pt[b+1].x){ 
         temp1 = pt[b].x; 
         pt[b].x = pt[b+1].x; 
         pt[b+1].x = temp1; 
         }      
        }        
       } 

它被正確排序。現在,當我打印我(標籤)時,它與排序時的x元素不一致。總之,只有x元素移動。我想讓i和y隨着x的排序而移動。我該怎麼辦?

+0

你只是改變x的值,無論是y或i的值 – Alexis

回答

1

而不是僅僅交換x您需要交換所有數據,以便整個結構數組得到排序。

你可以用一個單獨的函數做到這一點,爲了清楚:

void swap_points(struct points *pa, struct points *pb) 
{ 
    const struct points tmp = *pa; 
    *pa = *pb; 
    *pb = tmp; 
} 

然後調用而不是代碼三個最裏面的線在你的排序。

你真的應該只使用qsort()要做到這一點,這是更簡單:

static int compare_points(const void *va, const void *vb) 
{ 
    const struct points *pa = va, *pb = vb; 

    return pa->i < pb->i ? -1 : pa->i > pb->i; 
} 

qsort(pt, i, sizeof pt[0], compare_points); 
1

你實際上是排序數組,但只值我,而不是整個結構!

你會想用C的qsort這裏:

#include <stdlib.h> 
#include <stdio.h> 

struct points 
{ 
    int i; 
    int x; 
    int y; 
}; 

int compare(const struct points *a, const struct points *b) 
{ 
    if (a->i < b->i) return -1; 
    if (a->i == b->i) return 0; 
    if (a->i > b->i) return 1; 
} 

int main(void) 
{ 
    int i; 
    struct points p[3] = { { 4, 2, 1 }, { 1, 3, 5 }, { 2, 8, 1 } }; 

    qsort(p, 3, sizeof(struct points), 
     (int (*)(const void*, const void*)) compare); 

    printf("{ "); 
    for (i=0; i<3; ++i) 
    { 
     printf("{ %d, %d, %d }", p[i].i, p[i].x, p[i].y); 
     if (i < 2) printf(", "); 
    } 
    printf(" }\n"); 
} 

http://www.cplusplus.com/reference/cstdlib/qsort/

+0

謝謝!後續問題。排序後,如果在x元素中有關係,我怎麼能在增加y值時對它進行排序? –

+0

你只需要修改'compare()'函數。我認爲你首先想把它從'i'排序改爲'x'排序,然後編輯'a-> x == b-> x'來考慮'y',即添加一個嵌套塊在這個聲明中有三個「if」(如你在這裏)。 –

0

你必須複製在結構中的其他元素了。 我想你寫一個函數替換元素的值,如:

void copyPoints(point1* a, point2* b) 
{ 
    int temp = a->i; 
    a->i = b->i; 
    b->i = temp; 
    temp = a->x; 
    a->x = b->x; 
    b->x = temp; 
    temp = a->y; 
    a->y = b->y; 
    b->y = temp; 
} 

然後修改這樣的代碼:

for (a=0; a < i; a++) 
{ 
    for (b = 0; b < i; b++) 
    { 
     if (pt[b].x > pt[b+1].x) 
      copyPoints(&(pt[b]),&(pt[b+1])); 
    }        
}