user-0 提问: C语言，结构体排序！

回复:
user: user-1
content: 仅供参考//学号 姓名 电话 成绩 //01 XXX 182XXXXXXXX 88 #include <stdio.h> #include <string.h> #define MAXS 10000 struct ST {     int XH;     char XM[11];     char DH[13];     int CJ; } st[MAXS],t; int n,i,j; char ln[80]; FILE *f; int main() {     f=fopen("in.txt","r");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 1;     }     i=0;     while (1) {         if (NULL==fgets(ln,80,f)) break;         if (4!=sscanf(ln,"%d%10s%12s%d",&st[i].XH,st[i].XM,st[i].DH,&st[i].CJ)) {             st[i].XH=0;             strcpy(st[i].XM,"Unknown");             strcpy(st[i].DH,"Unknown");             st[i].CJ=0;             printf("line %d format error:%s!\n",i+1,ln);         }         i++;         if (i>=MAXS) {             printf(">%d lines Ignored.\n",MAXS);             break;         }     }     fclose(f);     n=i;     for (i=0;i<n-1;i++) {         for (j=i+1;j<n;j++) {             if (st[i].CJ<st[j].CJ) {t=st[i];st[i]=st[j];st[j]=t}         }     }     for (i=0;i<n;i++) {         printf("%5d%10s%12s%4d\n",st[i].XH,st[i].XM,st[i].DH,st[i].CJ);     }     return 0; }

user: user-0
content: 引用 7 楼 ruying1389279 的回复:[quote=引用 3 楼 mymtom 的回复:] 排序的基本操作就是比较和交换呀  #include <stdio.h> #include <stdlib.h>   struct num {     int id;     int math;     int eng;     int sum; };   int main(void) {     int i,j;     struct num stu[5];     struct num temp;      printf("请录入信息！\n");     printf("学号 数学 英语\n");     for (i = 0; i < 5; i++)     {         scanf("%d %d %d",&stu[i].id,&stu[i].math,&stu[i].eng);         stu[i].sum = stu[i].eng + stu[i].math;     }     printf("按总分降序排列!");     for (i = 0; i < 5; i++)     {         for (j = i+1; j < 5; j++)         {             if (stu[j].sum > stu[i].sum)             {                 temp = stu[i];                 stu[i] = stu[j];                 stu[j] = temp;             }         }     }     printf("总分\n");     for (i = 0; i < 5; i++)     {         printf("%d %d %d %d \n", stu[i].id, stu[i].math, stu[i].eng, stu[i].sum);     }      getchar();      return 0; }   vc++2010 这样写不对[/quote] 看到了，漏掉了一行代码

user: user-0
content: 引用 3 楼 mymtom 的回复:排序的基本操作就是比较和交换呀  #include <stdio.h> #include <stdlib.h>   struct num {     int id;     int math;     int eng;     int sum; };   int main(void) {     int i,j;     struct num stu[5];     struct num temp;      printf("请录入信息！\n");     printf("学号 数学 英语\n");     for (i = 0; i < 5; i++)     {         scanf("%d %d %d",&stu[i].id,&stu[i].math,&stu[i].eng);         stu[i].sum = stu[i].eng + stu[i].math;     }     printf("按总分降序排列!");     for (i = 0; i < 5; i++)     {         for (j = i+1; j < 5; j++)         {             if (stu[j].sum > stu[i].sum)             {                 temp = stu[i];                 stu[i] = stu[j];                 stu[j] = temp;             }         }     }     printf("总分\n");     for (i = 0; i < 5; i++)     {         printf("%d %d %d %d \n", stu[i].id, stu[i].math, stu[i].eng, stu[i].sum);     }      getchar();      return 0; }   vc++2010 这样写不对

user: user-0
content: 谢谢大家，昨晚刚看了结构体这一张，就是不懂到底怎么交换整个结构体。现在明白了，非常感谢大家！

user: user-2
content: 排序不能只让num交换，而是让整个结构体的内容都跟着交换就可以了。

user: user-3
content: 参考一下——http://blog.csdn.net/u012421456/article/details/40015333

user: user-4
content: 排序的基本操作就是比较和交换呀  #include <stdio.h> #include <stdlib.h>   struct num {     int id;     int math;     int eng;     int sum; };   int main(void) {     int i,j;     struct num stu[5];     struct num temp;      printf("请录入信息！\n");     printf("学号 数学 英语\n");     for (i = 0; i < 5; i++)     {         scanf("%d %d %d",&stu[i].id,&stu[i].math,&stu[i].eng);         stu[i].sum = stu[i].eng + stu[i].math;     }     printf("按总分降序排列!");     for (i = 0; i < 5; i++)     {         for (j = i+1; j < 5; j++)         {             if (stu[j].sum > stu[i].sum)             {                 temp = stu[i];                 stu[i] = stu[j];                 stu[j] = temp;             }         }     }     printf("总分\n");     for (i = 0; i < 5; i++)     {         printf("%d %d %d %d \n", stu[i].id, stu[i].math, stu[i].eng, stu[i].sum);     }      getchar();      return 0; }

user: user-5
content: 另外，你的排序本身，可能也是错误的

user: user-5
content: 有很多种方法 1种是不改变原始数据，只是另建一个指针数组，或者索引数组 这种多余大的数据排序比较好，因为大的数据，交换量很大  另外一种是改变数据的顺序的，通常的排序算法 比较的时候，比较总分就可以了， 交换的时候，交换整个结构  C,C++现在可以结构整体赋值，所以结构赋值语法很简练的  例如  struct num {     int id;     int math;     int eng;     int sum; }; C: void swap_num(struct num * a,struct num * b){  struct num n=*a;               *a=*b;               *b=n; }  C++ 可以直接用标准库的swap 也可以自己定义一个; void swap_num(num &a,num&b) {            num n=a;            a=b;            b=n; }  你的交换算法有问题，所以不能进行真正的排序