参考代码:
#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 人评分