原题链接:[编程入门]链表合并
参考代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Student{
double id;
double score;
struct Student* next;
}Node;
//传入指向头指针(头指针指向头节点)的指针(因为要改变指向头节点的头指针)、要插入的值
//如果传入Node*head,只能改变Node head(注意不是Node*head),head只是一个结构体,已经不是一个指向结构体的指针了!!!!
/// @brief 尾插(这里因为主函数只写了Node*head = NULL,所以if操作是必须的,作用就是给头指针赋个地址,这个地址存的就是头节点)
/// @param head 已经初始化过的头节点
/// @param id 参数
/// @param score 参数
void AddatEnd(Node** head, int id, int score)
{
Node* new_node = (Node*)malloc(sizeof(Node));//固定写法,背下来吧
new_node->id = id;
new_node->score = score;
new_node->next = NULL; //记得给next赋值NULL
Node *cur = *head; //头节点还需要传出,不可以随意更改,因此使用临时节点遍历
if(*head ==NULL)
{
*head = new_node; //头指针为空,意思是没有头节点(头指针指向头节点,头指针存放的地址就是头节点这个结构体的地址)
return;
}
while(cur->next!=NULL)
{
cur = cur->next;
}
cur->next = new_node;
}
/// @brief 合并两个链表
/// @param head1 第一个链表
/// @param head2 第二个链表
/// @return 合并后的链表
Node* Unit(Node* head1,Node* head2)
{
if(head1==NULL) //头指针存的NULL,也就是头节点为空
{
return head2;
}
Node* cur = head1;
while(cur->next != NULL)
{
cur = cur->next;
}
cur->next = head2;
return head1;
}
/// @brief 按学号升序排列
/// @param head 合并好的链表
/// @param len n+m链表长度
/// @return 排序好的链表
Node* SortNode(Node *head,int len){
//printf("%d",len);
Node *cur = head;
Node *temp = (Node*)malloc(sizeof(Node)); //这里一定不要置空!!!
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len - i - 1; j++)//这里一定注意,读取的是cur->next所以一定要保证有next
{
// printf("changede!%lf %lf\n",cur->id,cur->next->id);
if(cur->id>cur->next->id)
{
temp->id = cur->next->id;
temp->score = cur->next->score;
cur->next->id = cur->id;
cur->next->score = cur->score;
cur->id = temp->id;
cur->score = temp->score;
//printf("changed!");
}
cur = cur->next; //记得移动!!!!
}
cur = head;
}
//printf("%lf",cur->next->next->next->next->id);
return head;
}
/// @brief 打印链表
/// @param head 合并后的头节点!!
void Print(Node *head)
{
Node *cur = head;
while(cur!=NULL)
{
printf("%.0lf %.0lf\n",cur->id,cur->score);
cur = cur->next;
}
printf("\n");
}
//返回值为void,所以对入参操作时不返回,要想改变头指针,只有通过二级指针改变。
//返回值为Node*,对入参操作后直接返回给原函数,不用通过二级指针修改
int main(){
int n,m;
scanf("%d%d",&n,&m);
Node *head1 = NULL;
int len = n+m; //记录!!因为后面while循环把n,m改了
double c1,c2;
while(n--)
{
scanf("%lf%lf",&c1,&c2);
AddatEnd(&head1,c1,c2);
}
Node *head2 = NULL;
while(m--)
{
scanf("%lf%lf",&c1,&c2);
AddatEnd(&head2,c1,c2);
}
//printf("%d\n",n+m);
Node *res = Unit(head1,head2);
Node *ans = SortNode(res,len);
//printf("%d\n",n+m);
//Print(head1);
//Print(head2);
Print(ans);
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复