c语言中的结构体按元素大小进行冒泡排序

#include<stdio.h>
struct student
{
    char name[16];//name
    unsigned char age;//年龄
    unsigned char score;//成绩
    char classes[100];//班级
};
void swap(struct student st[] ,int length) {  //这个地方可以写成struct student *st; 其实可以将结构体当成为数组进行操作
    struct student tmp;
    int i, j;
    for (j = 0 ; j < length; j++) {
        for ( i = 1; i < length - j; i++)
        {
            if (st[i].age < st[i - 1].age)
            {
                tmp = st[i];
                st[i] = st[i - 1];
                st[i - 1] = tmp;
            }
        }
    }
}
int main() {
    struct student st[5]=
    {
        {"周永康",70,59,"C++基础班"},{"徐才厚",60,30,"JAVA班"},{"薄熙来",72,90,"PHP班"},{"令计划",50,32,"平面设计"},{"金三胖",30,78,"IOS系统"}
    };

    int length = 5;

    swap(st,length);

    for (int i = 0; i < length; i++)
    {
        printf("姓名%s,年龄 = %d,成绩 = %d,班级 = %s\n",st[i].name,st[i].age ,st[i].score,st[i].classes);
    }
    return 0;
}

第二种方法

#include<stdio.h>
struct student
{
 char name[16];//name
 unsigned char age;//年龄
 unsigned char score;//成绩
 char classes[100];//班级
};

void swap(struct student* a, struct student* b) {
 struct student tmp;
 *a = *b;
 *b = tmp;
}

int main() {
 struct student st[5] =
 {
  {"周永康",70,59,"C++基础班"},{"徐才厚",60,30,"JAVA班"},{"薄熙来",72,90,"PHP班"},{"令计划",50,32,"平面设计"},{"金三胖",30,78,"IOS"}
 };

 int length = 5;
 struct student tmp = st[0];
 st[0] = st[1];
 st[1] = tmp;
 int i, j;
 for (i = 0; i < length; i++)
 {
  for (j = 1; j < length - i; j++)
  {
   if (st[j].age < st[j - 1].age)
   {
    swap(&st[j], &st[j - 1]);
   }
  }
 }

 for (int i = 0; i < length; i++)
 {
  printf("姓名%s,年龄 = %d,成绩 = %d,班级 = %s\n", st[i].name, st[i].age, st[i].score, st[i].classes);
 }
 return 0;
}

这两种方法中,都用到的方法是将整个结构体看成是一个元素,就像是一个int型变量那样。通过比较了之后,然后再进行元素之间的交换。可以直接进行值之间的传递。相当于下面的这个类型变化的代码。在这上面的两个代码中,我提倡第二个代码,这个代码中

将交换的部分进行抽取了出来,这样有助于后面的使用,在后面的部分如果成绩相当,我们可以按照年龄进行排序,这个交换的部分我们可以直接进行调用swap这个函数就可以了。

void (int *a,int *b)
{  
        int c ;
        if(a>b) 
        { 
        c = a; a = b;b =c;  
        }     
}