0

名前と年齢を含むエントリが定義された単純な構造があります。これらの構造の配列を前提として、年齢に基づいて配列を並べ替えたいと思います。

以下はこれを適用する私の試みですが、現時点ではこれをコンパイルすることさえできません。私のポインタロジックは、ifステートメントの比較とそれに続くポインタの交換の両方で正しくないと思います。同じことをするためにいろいろな方法を試しましたが、どこにも行きません。私はCにかなり慣れていませんが、まだポインターに頭を悩ませようとしているので、おそらくそれは私が誤解している基本的なことです。誰かが私が間違っていることを以下に説明できますか?

どんな助けでも大歓迎です。

#include <stdio.h>

struct entry {
    char name[15];
    int age;
};

void entrySort( struct entry *dict);

void entrySort( struct entry *dict){
    int i,j;   // counters
    int ct = 4;
    struct entry *tmp;  // temporary holder

    for( i = 0; i < ct; i++){
        for( j = 0; j < ct; j++ ){
            if ((*dict[i].age) > (*dict[j].age)){
            tmp = (dict + i);
            (dict+i) = (dict+j);
            (dict+j) = tmp;

        }
    }
}

int main (void){
    int ct = 4, i;
    struct entry reg[4] =
       {{ "John", 24 },
        { "Alan", 18 },
        { "Jim", 40 },
        { "Sarah",32 }};

     entrySort(reg);

    for( i = 0; i < ct; i++)
        printf("name: %s. Age: %d\n", reg[i].name, reg[i].age);

   return 0;
}
4

3 に答える 3

2

オブジェクトの配列をポインタとして渡しstruct entryます: 。ただし、オブジェクトstruct entry *dictへのポインタの配列と同じように扱います。struct entry(*dict[i]).age

(dict+i)はまだメモリを指すポインタにすぎませんi+1。要素が保存され&dict[i]ます。インデックスでこの要素に実際にアクセスするには、に等しい間接参照演算子iを使用する必要があります。*(dict + i)dict[i]

iまた、とでの要素の交換jが間違っていることにも注意してください。「一時的な所有者」tmpは、メモリへのポインタだけでなく、書き換えるデータを一時的に保持するオブジェクトである必要があります。したがって、次のように宣言しますstruct entry tmp;

struct entry tmp;

for( i = 0; i < ct; i++) {
    for( j = 0; j < ct; j++ ) {
        if ((dict[i].age) > (dict[j].age)) {
            tmp = dict[i];
            dict[i] = dict[j];
            dict[j] = tmp;
        }
    }
}

ちなみに、あなたが投稿したコードでは、あなたの末尾の中括弧(}ifが欠落しています。

于 2013-02-17T00:15:32.403 に答える
1

試す:

#include <stdio.h>

struct entry {
    char name[15];
    int age;
};

void entrySort( struct entry *dict, int);

void entrySort( struct entry *dict, int ct){
    int i,j;   // counters
    /* int ct = 4; */
    struct entry tmp;  // temporary holder

    for( i = 0; i < ct; i++){
        for( j = 0; j < ct; j++ ){
            if ((dict[i].age) > (dict[j].age)){  /* no *  */
            tmp = *(dict + i);
            *(dict+i) = *(dict+j);
            *(dict+j) = tmp;

        }
    }
}

int main (void){
    int ct = 4, i;
    struct entry reg[4] =
       {{ "John", 24 },
        { "Alan", 18 },
        { "Jim", 40 },
        { "Sarah",32 }};

     entrySort(reg, ct);

    for( i = 0; i < ct; i++)
        printf("name: %s. Age: %d\n", reg[i].name, reg[i].age);

   return 0;
}
于 2013-02-17T00:17:19.403 に答える
1

完全を期すために、次のようにしますqsort

#include <stdlib.h>
int sort_entry(const void *va, const void *vb) {
    const struct entry *a = va;
    const struct entry *b = vb;
    if(a->age < b->age) return -1;
    else if(a->age == b->age) return 0;
    return 1;
}

...

qsort(reg, ct, sizeof(struct entry), sort_entry);
于 2013-02-18T18:25:54.187 に答える