C:如何通过其中一个元素对Struct进行排序?无法使用指针

时间:2017-10-09 13:31:21

标签: c function sorting struct

如何对这样的结构进行排序:

git log origin/master

其中一个属性,如价格或重量?先前声明了Automobil数组。 我不能使用指针和任何其他内置函数。

typedef struct
{
    int weight;
    int price;
    Color color;
    Equip equip;
}Cars;

我尝试这样做,但它没有做任何事...... 另外,如果有人能告诉我,我怎么能把像这样的结构传递给函数我真的很感激!

2 个答案:

答案 0 :(得分:2)

好吧,首先你要做的事情并不像有些人可能会告诉你的那样糟糕,因为小N泡泡排序仍然非常快。以下是你的,当然你需要一个双循环:

int main() {
    Cars automobil[NC];
    // Initialiase automobil here

    for (int i = 0; i < NC - 1; ++i) {
        int am = i;
        for (int j = i+1; j < NC; ++j) {
            if ( automobil[am].weight > automobil[j].weight )
                am = j;
        }

        if ( am != i) {
            Cars tmp = automobil[am];
            automobil[am] = automobil[i];
            automobil[i] = tmp;
        }
    }

    for (int i = 0; i < NC; ++i)
        printf("%d\n", automobil[i].weight);

}

请注意,我们可以复制结构但是在这里我们尽可能少地尝试。

然而,它很容易说出来&#34;我将永远不会超过十辆汽车&#34;然后发现你正试图排序数千,所以我会敦促你学习和理解qsort():

int carsSort(const void *a, const void *b) {
    return ((Cars *) a)->weight - ((Cars *) b)->weight;
}

int main() {
    Cars automobil[NC];
    // Initialiase automobil here

    qsort(automobil, NC, sizeof *automobil, carsSort);

    for (int i = 0; i < NC; ++i)
        printf("%d\n", automobil[i].weight);
}

约翰

PS:回复&#34;如何将数组传递给函数?&#34;记住K&amp; R的许多明智的说法之一:&#34;当一个数组名称传递给一个函数时,传递的是数组开头的位置&#34;。

因此:

int carsSort(const void *a, const void *b) {
    return ((Cars *) a)->weight - ((Cars *) b)->weight;
}

void sortThem(Cars autom[]) {
    qsort(autom, NC, sizeof *autom, carsSort);
}

int main() {
    Cars automobil[NC];       
    // Initialiase automobil here

    sortThem(automobil);

    for (int i = 0; i < NC; ++i)
        printf("%d\n", automobil[i].weight);
}

在sortThem()&#34; autom&#34;是一个变量,其值是automobil [0]的地址。

答案 1 :(得分:1)

这里没有进入实现细节是一个冒泡排序的程序算法(不在C中): Bubble Sort Algorithm 。请注意,如注释中所述,此冒泡排序实现使用嵌套循环。

要记住的另一个项目:为了切换两个对象,需要使用相同类型的第三个临时对象。例如:

int temp
int arr1[]={2,5,7,2,9,1,8,0,5,2,1};
int count = sizeof(arr1)/sizeof(arr1[0])
for(int i = 0; i < count-1; i++ )
{
    if(arr1[i]>arr1[i+1])
    {
        temp = arr1[i];
        arr1[i] = arr1[i+1];
        arr[i+1] = temp;
    }
}

因为您要对成员集合中的单个成员进行排序,所以每次交换条件存在时,分配交换例程都需要交换每个成员,即尽管确定交换条件exists仅考虑一个成员,交换将包括所有成员:weightpriceColorEquip。并且,如果ColorEquip属于struct类型(您的帖子未指定),则还需要交换属于要比较的数组元素的这些对象的每个成员。

您应该期待最终使用指针,因为这将显着减少完成此排序所需的赋值语句的数量。