#include<iostream>
#include<string>
using namespace std;
struct Student //创建结构体Student
{
int number; //学号
string name;
float score; //成绩
Student* next; //结构体(Student)类型的指针变量next
};
Student* CreateList(int n) //创建链表
{
Student* head, * p; //head为头指针,p为当前指针
p = head = new Student; //创建存储空间
for (int k = 1; k < n; k++) //前一个的尾接后一个的头
{
cin >> p->number >>p->name>> p->score;
p->next = new Student; //为下一个节点创建存储空间
p = p->next; //指针变量p指向下一个节点
}
cin >> p->number >> p->name >> p->score; //输入最后一个成员的信息
p->next = NULL; //最后指针变量p指向空
return head; //返回头指针
}
Student* Link(Student* h1, Student* h2) //连接链表函数,将两个链表连接
{ //h1为第一个链表的头指针,h2为第二个链表的头指针
Student* p = h1;
while (p->next != NULL) //将指针变量p移动到第一个链表的末尾
p = p->next;
p->next = h2; //将第二个链表连接在第一个链表后面
return h1; //返回第一个链表的头指针
}
void selectSort(Student* head) //链表排序函数(选择排序法)
{
//指针变量p指向头指针,若该指针指向的下一个节点不为空,则该节点与下一个节点进行比较
for (Student* p = head; p->next!=NULL; p=p->next) //外循环决定循环次数
{
Student* minp = p; //指针变量minp指向第一个节点
//第一个节点与第二个节点进行比较,若第二个小,则将minp指向第二个节点
//每进行一轮可以筛选出一个最小的节点,将最小的节点与最前面的一个节点进行交换
//已经交换之后排序好的不参与下一轮比较
for (Student* q = p->next; q != NULL; q=q->next)
{
if (minp->number > q->number)
minp = q;
}
//交换节点的成员信息
int t = minp->number; minp->number = p->number; p->number = t;
float b = minp->score; minp->score = p->score; p->score = b;
string a = minp->name; minp->name = p->name; p->name = a;
}
}
void printList(Student* head) //打印链表
{
for (Student* p = head; p != NULL; p=p->next)
{
cout << p->number << " " << p->name << " ";
printf("%.1f\n", p->score);
}
}
int main()
{
int n, m; //两个链表长度分别为n,m
cin >> n >> m;
//定义结构体类型的指针变量L1,L2分别指向两个链表,L指向连接后的链表
Student* L1, * L2, * L;
L1 = CreateList(n); //调用创建链表函数
L2 = CreateList(m);
L = Link(L1, L2); //调用连接链表函数
selectSort(L); //调用链表排序函数
printList(L); //调用打印链表函数
return 0;
}