C:如何按结构的一个元素对结构进行排序?Can';不要使用指针

C:如何按结构的一个元素对结构进行排序?Can';不要使用指针,c,function,sorting,struct,C,Function,Sorting,Struct,如何对结构进行如下排序: typedef struct { int weight; int price; Color color; Equip equip; }Cars; 通过它的属性之一,比如价格或重量?Automobil阵列先前已声明。 我不能使用指针和任何其他内置函数 Cars automobil[5]; Cars mobilOne={}; for(i=0; i<5; i++) { if((i+1)==5) { b

如何对结构进行如下排序:

typedef struct
{
    int weight;
    int price;
    Color color;
    Equip equip;
}Cars;
通过它的属性之一,比如价格或重量?Automobil阵列先前已声明。 我不能使用指针和任何其他内置函数

Cars automobil[5]; 
Cars mobilOne={};

for(i=0; i<5; i++)
{
    if((i+1)==5)
    {
        break;
    }else
    {
        if (automobil[i].weight> automobil[i+1].weight)
        {
            mobilOne = automobil[i];
            automobil[i] = automobil[i+1];
            automobil[i+1] = mobilOne;
        }
    }
}
Cars-automobil[5];
移动电话={};
对于(i=0;i汽车[i+1]。重量)
{
美孚通=汽车[i];
汽车[i]=汽车[i+1];
汽车[i+1]=美孚通;
}
}
}
我试着这样做,但是没有任何效果。。。
还有,如果有人能告诉我,我如何才能将这样的结构传递到一个函数中,我将非常感激

这里不讨论实现细节,而是一个冒泡排序的过程算法(不在C中):。注意,如注释中所述,此冒泡排序实现使用嵌套循环

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

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;
    }
}
int-temp
int arr1[]={2,5,7,2,9,1,8,0,5,2,1};
int count=sizeof(arr1)/sizeof(arr1[0])
对于(int i=0;iarr1[i+1])
{
温度=arr1[i];
arr1[i]=arr1[i+1];
arr[i+1]=温度;
}
}
由于您是在成员集合的单个成员上进行排序,因此每次交换条件存在时,分配交换例程都需要交换每个成员,即,尽管确定交换条件是否存在只考虑一个成员,但交换将包括所有成员:
权重
价格
颜色
装备
。而且,如果
Color
equipment
属于
struct
类型(您的帖子没有指定),那么属于要比较的数组元素的这些对象的每个成员也需要交换


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

这里不讨论实现细节,而是一个冒泡排序的过程算法(不在C中):。注意,如注释中所述,此冒泡排序实现使用嵌套循环

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

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;
    }
}
int-temp
int arr1[]={2,5,7,2,9,1,8,0,5,2,1};
int count=sizeof(arr1)/sizeof(arr1[0])
对于(int i=0;iarr1[i+1])
{
温度=arr1[i];
arr1[i]=arr1[i+1];
arr[i+1]=温度;
}
}
由于您是在成员集合的单个成员上进行排序,因此每次交换条件存在时,分配交换例程都需要交换每个成员,即,尽管确定交换条件是否存在只考虑一个成员,但交换将包括所有成员:
权重
价格
颜色
装备
。而且,如果
Color
equipment
属于
struct
类型(您的帖子没有指定),那么属于要比较的数组元素的这些对象的每个成员也需要交换


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

好吧,首先,你要做的事情并不像一些人告诉你的那么糟糕,因为小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);

}
intmain(){
汽车公司;
//这里是汽车公司
对于(int i=0;i汽车[j].重量)
am=j;
}
如果(am!=i){
汽车tmp=汽车[am];
汽车[am]=汽车[i];
汽车[i]=tmp;
}
}
对于(int i=0;i
请注意,我们可以复制结构,但即使在这里,我们也尽量少复制

然而,很容易说“我拥有的汽车永远不会超过十辆”,然后发现您正试图对几千辆进行分类,因此我建议您学习并理解qsort():

int carsSort(常数无效*a,常数无效*b){
返回((车*)a)->重量-((车*)b)->重量;
}
int main(){
汽车公司;
//这里是汽车公司
qsort(汽车,北卡罗来纳州,sizeof*automobil,carsSort);
对于(int i=0;i
约翰

PS:在回答“如何将数组传递给函数?”时,请记住K&R的一句至理名言:“当数组名传递给函数时,传递的是数组开头的位置”

因此:

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);
}
int carsSort(常数无效*a,常数无效*b){
返回((车*)a)->重量-((车*)b)->重量;
}
void sortThem(汽车自动[]){
qsort(自动、数控、尺寸*自动、卡塞尔特);
}
int main(){
汽车公司;
//这里是汽车公司
sortThem(汽车);
对于(int i=0;i

在sortThem()内部,“autom”是一个变量,其值是automobil[0]的地址。

好的,首先,您尝试做的事情并不像一些人可能告诉您的那么糟糕,因为对于小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);

}
intmain(){
汽车公司;
//这里是汽车公司
对于(int i=0;i汽车[j].重量)
am=j;
}
如果(am!=i){
汽车tmp=汽车[am];
自动移动