#include
#include
typedef struct student
{
int id;
int score;
struct student *next;
}STU;
int stuIndex;
void inputStuInfo(STU *stuHead);//输入学生信息
void orderStuInfo(STU *stuHead);//按照分数高到低顺序重组链表
void printStuInfo(STU *stuHead,int flag);//打印学生信息。参数flag=0:正常打印链表信息。flag!=0:打印排序后的名次信息
int main()
{
STU *stuHead=(STU *)malloc(sizeof(STU));
stuHead->next=NULL;
stuIndex=1;
inputStuInfo(stuHead);
printf("--打印原始输入的链表!--\n");
printStuInfo(stuHead,0);
printf("--开始按分数降序排列!--\n");
orderStuInfo(stuHead);
printf("--链表按降序重组完成!--\n");
printf("--打印降序排序的链表!--\n");
printStuInfo(stuHead,1);
return 0;
}
void orderStuInfo(STU *stuHead)
{
STU *stuSave1=NULL,*stuSave2=NULL,stuSave3;
stuSave1=stuHead;
while(stuSave1->next!=NULL)//冒泡排序
{
stuSave2=stuSave1->next;
while(stuSave2->next!=NULL)
{
if(stuSave1->next->scorenext->score)//交换成员值,保留原链表指针值
{
stuSave3=*(stuSave1->next);
stuSave1->next->id=stuSave2->next->id;
stuSave1->next->score=stuSave2->next->score;
stuSave2->next->id=stuSave3.id;
stuSave2->next->score=stuSave3.score;
}
stuSave2=stuSave2->next;
}
stuSave1=stuSave1->next;
}
}
void printStuInfo(STU *stuHead,int flag)
{
int i=1;
while(stuHead->next!=NULL)
{
if(flag==0)
printf("学生%d,成绩%d\n",stuHead->next->id,stuHead->next->score);
else
printf("第%d名,学生%d,成绩%d\n",i++,stuHead->next->id,stuHead->next->score);
stuHead=stuHead->next;
}
}
void inputStuInfo(STU *stuHead)
{
int score;
STU *stuNew=NULL,*stuTail=NULL;
while(1)
{
printf("输入学生%d的成绩:(输入负数结束输入)",stuIndex);
scanf("%d",&score);
if(score<0)
break;
stuNew=(STU *)malloc(sizeof(STU));
stuNew->score=score;
stuNew->id=stuIndex;
stuNew->next=NULL;
if(stuHead->next==NULL)
stuHead->next=stuNew;
else
stuTail->next=stuNew;
stuTail=stuNew;
stuIndex++;
}
}
#include
#include
typedef struct student
{
int index; //学生的序号
int score; //学生的成绩
}STUDENT_T;
//根据学生成绩进行冒泡排序
void ranking(STUDENT_T *a, int cnt)
{
int i = 0;
int j = 0;
STUDENT_T tmp = {0};
for (i = 0; i < cnt; i++)
{
for (j = i+1; j < cnt; j++)
{
if (a[i].score < a[j].score)
{
memcpy(&tmp, &a[j], sizeof(STUDENT_T));
memcpy(&a[j], &a[i], sizeof(STUDENT_T));
memcpy(&a[i], &tmp, sizeof(STUDENT_T));
}
}
}
}
void main(int argc, char *argv[])
{
int i = 0;
int j = 0;
int cnt = 0;
int rank = 0;
STUDENT_T student[1024] = {0};
char tmp[32] = {0};
printf("请输入学生人数:\n");
scanf("%d", &cnt);
if (cnt > 1024)
{
printf("最多1024个学生\n");
return;
}
printf("请按序号依次输入%d个学生的成绩\n", cnt);
for (i = 0; i < cnt; i++)
{
printf("第%d个学生:\n", i+1);
scanf("%s", tmp);
student[i].index = i+1;
student[i].score = atoi(tmp);
}
//根据成绩进行排名
ranking(student, cnt);
//计算名次并打印
for (i = 0; i < cnt; i++)
{
//名次要考虑到并列的情况
if (0 == i || student[i].score != student[i-1].score)
{
rank = i+1;
}
printf("名次:%d 序号:%d 成绩:%d\n", rank, student[i].index, student[i].score);
}
}
语文:88.5 数学:80 体育:66 英语:45.5 物理:40 化学:31 实验:30
没有具体给出学生人数的话,最好用链表,
输出前可以先对链表按照分数排好序。
不用链表的话动态数组也行,静态数组的话,你定义的足够大也很好。就是浪费空间了。
自己百度吧,不难的。
#include "stdio.h"
#include "stdlib.h"
struct student
{
int num;
int chengji;
};
void main()
{
struct student a[100],temp;
int n,i,j;
scanf("%d",&n);
for(i=0;i
scanf("%d%d",&a[i].num,&a[i].chengji);
}
for(i=0;i
if(a[j+1].chengji>a[j].chengji)
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
for(i=0;i
printf("%d %d %d\n",i+1,a[i].num,a[i].chengji);
}
}