徐世龙


私信TA

用户名:dotcpp0681143

访问量:556

签 名:

等  级
排  名 8234
经  验 1249
参赛次数 0
文章发表 12
年  龄 0
在职情况 学生
学  校 xdu
专  业

  自我简介:



参考代码:

#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 人评分

  评论区

  • «
  • »