已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。

1.程序编写

#include
#include
#define n 5  //定义每个链表中的结点数,即每个链表中有五位学生
#define LEN sizeof(struct student)   //命令行,令 LEN 代表struct student类型数据的长度
typedef struct student
{
	int num;
	float score;
	struct student * next;
}stu;
stu * creat()  //定义函数,此函数带回一个指向链表头的指针
{
	stu * p,* head = NULL, * tail = head;
	for (int i = 0; i < n; i++)
	{
		p = (stu *)malloc(LEN);  //开辟一个新单元
		scanf("%d %f", &p->num, &p->score);
		p->next = NULL;
		if (p->num < 0)
		{
			free (p);
			break;
		}
		if (head == NULL)
		{
			head = p;
		}
		else
			tail->next = p;
		tail = p;
	}
	return head;
}
stu * link(stu *p1, stu *p2)
{
	stu * p, *head;
	if (p1->num < p2->num)
	{
		head = p = p1;
		p1 = p1->next;
	}
	else
	{
		head = p = p2;
		p2 = p2->next;
	}
	while ((p1 != NULL) && (p2 != NULL))
	{
		if (p1->num < p2->num)
		{
			p->next = p1;
			p = p1;
			p1 = p1->next;
		}
		else
		{
			p->next = p2;
			p = p2;
			p2 = p2->next;
		}
		if (p1 != NULL)
		{
			p->next = p1;
		}
		else
		{
			p->next = p2;
		}
	}
	return head;
}
void print(stu * p)
{
	if (p == NULL)
	{
		printf("空链表!\n");
	}
	while (p != NULL)
	{
		printf("%d %5.2lf\n", p->num, p->score);
		p = p->next;
	}
}
int main()
{
	stu * a, * b, * c;
	printf("请输入链表a的信息,学号小于零时结束:格式(学号 成绩)\n");
	a = creat();
	printf("请输入链表b的信息,学号小于零时结束:格式(学号 成绩)\n");
	b = creat();
	printf("链表a的信息为:\n");
	print(a);
	printf("链表b的信息为:\n");
	print(b);
	c = link(a, b);
	printf("合并后链表的信息为:\n");
	print(c);
	return 0;
}

2.学生信息备份

9001  90             9002  52	
9003  98  	         9004  69 
9005  96             9006  64	
9007  96             9008  65	
9009  63  	         9010  63

3.结果演示
已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。_第1张图片

你可能感兴趣的:(已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。)