2010-01-26 5 views
1

Скажут, у меня есть эта структура:подкачка элементов в массиве структур

struct MyStruct { 
    int iID; 
    int iMyNumber; 
}; 

Затем я определяю массив MyStructs:

struct MyStruct msTest[3]; 

Я делаю операцию сортировки на структуру аналогичны это, глядя на идентификатор. Теперь, как только я узнаю, какие записи должны быть заменены для сортировки массива, я должен выполнить фактическую свопинг. Я попытался это:

if (iSmallest != iCntr) { 
    stPTmp = &stXDB[iCntr]; 
    &stXDB[iCntr] = &stXDB[iSmallest]; 
    &stXDB[iSmallest] = &stPTmp; 
} 

stPTmp определяется как void *stPTmp; и iCntr и iSmallest содержат индексы записей, которые будут заменены. Мой код не работает, но как его исправить?

ответ

4

Вы должны поменять элементы, а не указатели,

struct MyStruct stTmp; 

if (iSmallest != iCntr) { 
    stTmp = stXDB[iCntr]; 
    stXDB[iCntr] = stXDB[iSmallest]; 
    stXDB[iSmallest] = stTmp; 
} 

Не очень эффективно, но ваши структуры являются мало, поэтому его лишь немного дороже, чем замена указателей.

3

Вы могли бы просто позволить кому-то еще думать об этом, то есть использовать qsort():

#include <stdlib.h> 


int compare_struct(const void *a, const void *b) 
{ 
    const struct MyStruct *sa = a, *sb = b; 

    return (sa->iID < sb->iID) ? -1 : sa->iId > sb->iId; 
} 

qsort(msTest, sizeof msTest/sizeof *msTest, sizeof *msTest, compare_struct); 

Обратите внимание, что это полностью отпала необходимость писать функцию свопинга. Под капотом это может быть немного более дорогостоящим (можно использовать malloc(), почти наверняка использует memcpy()), но его проще писать и намного проще в обслуживании.

3

Джон уже ответил на ваш вопрос, но сортировать struct с, вы можете использовать стандартную библиотеку qsort() функцию:

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

struct MyStruct { 
    int iID; 
    int iMyNumber; 
}; 

/* comparison function, should return < 0, > 0 or == 0 
    if a < b, a > b or a == b respectively. Used by qsort */ 
static int comp_mystruct(const void *a, const void *b); 

/* utility function to print an array of our struct */ 
static void print_mystruct(const void *start, size_t n); 

int main(void) 
{ 
    /* some data */ 
    struct MyStruct data[] = { 
     { 1, 10 }, 
     { 5, 50 }, 
     { 2, 20 }, 
     { -3, 100 } 
    }; 
    size_t ndata = sizeof data/sizeof data[0]; 

    /* before sorting */ 
    print_mystruct(data, ndata); 
    putchar('\n'); 

    /* sort the array now */ 
    qsort(data, ndata, sizeof data[0], comp_mystruct); 

    /* after sorting */ 
    print_mystruct(data, ndata); 

    return 0; 
} 

static void print_mystruct(const void *start, size_t n) 
{ 
    size_t i; 
    const struct MyStruct *s = start; 
    for (i=0; i < n; ++i) { 
     printf("% 3d % 3d\n", s[i].iID, s[i].iMyNumber); 
    } 
} 

static int comp_mystruct(const void *a, const void *b) 
{ 
    const struct MyStruct *sa = a; 
    const struct MyStruct *sb = b; 
    if (sa->iID > sb->iID) { 
     return 1; 
    } else if (sa->iID < sb->iID) { 
     return -1; 
    } else { 
     return 0; 
    } 
} 

Выход программы является:

1 10 
    5 50 
    2 20 
-3 100 

-3 100 
    1 10 
    2 20 
    5 50 

Преимущество что qsort() является стандартным, и вы можете использовать его для сортировки.

Смежные вопросы