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]。要在 index 处实际访问此元素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

为了完整起见,以下是您的操作方法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 回答
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 回答