结构体:链表合并

#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;
}

 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值