#include <iostream>
using namespace std;
struct student
{int num;char name[10];float score[3];float sum;student *next;
};void main()
{student a[5];student *h, *curr, *temp, *last; //h头指针,curr当前指针,last当前指针的上一个指针(curr的上一个指针)for (int i = 0; i < 5; i++){cout << "student" << i + 1 << ":"<<endl;cin >> a[i].name >> a[i].num >> a[i].score[0] >> a[i].score[1] >> a[i].score[2];a[i].sum = a[i].score[0] + a[i].score[1] + a[i].score[2];}h = a;for (int i = 0; i<4; i++)a[i].next = &a[i + 1];a[4].next = NULL;for (int j = 0; j<4; j++){curr = h;for (int i = 0; i<4 - j; i++){if (curr->sum>curr->next->sum){if (i == 0) //将第一个结点和第二个结点交换,此时需要改变头指针{temp = h;h = h->next; //将头指针设为第二个节点temp->next = h->next; //令第一个节点后面接第三个节点h->next = temp; //令第二个节点后面接第一个节点curr = h->next;continue;}else //交换curr和curr->next指针{last = h;for (int k = 0; k<i - 1; k++)last = last->next; //找出curr的上一个指针temp = curr; //原理和上面交换第一二个结点是一样的,将上面i==0的代码中的h替换成curr即可得到下面的代码curr = curr->next;temp->next = curr->next;curr->next = temp;last->next = curr; //将上一个指针和交换后的curr指针相连}}curr = curr->next;}}//打印排序后的信息cout << "num" << '\t' << "name" << '\t' << "score1" << '\t' << "score2" << '\t' << "score3" << '\t' << "sum" << endl;for (int i = 0; i<5; i++){cout << h->num << '\t' << h->name << '\t' << h->score[0] << '\t' << h->score[1] << '\t' << h->score[2] << '\t' << h->sum << endl;h = h->next;}}