怪盗KID


私信TA

用户名:dotcpp0774863

访问量:1014

签 名:

一万年太久,只争朝夕。

等  级
排  名 1722
经  验 2685
参赛次数 0
文章发表 20
年  龄 19
在职情况 学生
学  校 哔哩哔哩
专  业

  自我简介:

解题思路:

//用到链表的基础用法,链表中节点按照成员排序的话用插入法比较好用。

注意事项:

//第一次写链表题目


参考代码:

#include <stdio.h>
#include <stdlib.h>
// 定义链表节点  
typedef struct ListNode {
    int student_number;          // 节点存储的数据
    int score;
    struct ListNode* next;  // 指向下一个节点的指针  
} ListNode;

ListNode* List_create() {
    return NULL; // 空链表就是返回NULL  
}

// 遍历链表并打印  
void List_Print(ListNode* head) {    //传入的参数是结构体类型的指针,也是链表开头结构体的指针,所以也可以说是传入了链表
    ListNode* current = head;
    while (current != NULL) {
        printf("%d %d\n", current->student_number, current->score);
        
        current = current->next;
    }
    
}

// 在链表末尾添加元素  
void List_End_appendNode(ListNode** head, int student_number, int score) {
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); // 创建新节点  
    if (newNode == NULL) {
        printf("Memory allocation failed\n");
        return;
    }
    newNode->student_number = student_number;
    newNode->score = score;
    newNode->next = NULL;

    if (*head == NULL) {
        // 如果链表为空,新节点即为头节点  
        *head = newNode;        //改变了头节点的地址
    }                           //*head存储的是链表的头地址
    else {
        // 否则,遍历到链表末尾,将新节点添加进去  
        ListNode* current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}


//链表拼接
void List_Link(ListNode** head_1, ListNode** head_2) {
    if (head_1 == NULL || *head_1 == NULL || head_2 == NULL || *head_2 == NULL) {
        // 处理空指针的情况,比如打印错误信息或设置错误代码  
        return;
    }
    ListNode* current = *head_1;
    while (current->next != NULL) {
        current = current->next;
    }
    current->next = *head_2;
}


// 插入排序函数 ,根据student_number排序
void List_insertionSort(ListNode** head) {
    ListNode* sorted = NULL; // 初始化一个空的已排序链表  
    ListNode* current = *head;
    while (current != NULL) {
        ListNode* nextTemp = current->next; // 保存当前节点的下一个节点  
        
        // 将当前节点插入到已排序链表中的正确位置,此时current->next会变更,不在与原链表连接
        if (sorted == NULL || sorted->student_number >= current->student_number) {
            // 如果已排序链表为空,或者当前节点应该插入到已排序链表的头部  
            current->next = sorted;
            sorted = current;
        }
        else {
            // 否则,在已排序链表中查找插入位置  
            ListNode* prev = NULL;
            ListNode* temp = sorted;
            while (temp != NULL && temp->student_number < current->student_number) {
                prev = temp;
                temp = temp->next;
            }
            prev->next = current; // 将当前节点插入到正确位置  
            current->next = temp;
        }

        current = nextTemp; // 移动到原始链表的下一个节点  
    }

    *head = sorted; // 更新头指针  
}



int main() {

    int n, m;
    scanf("%d %d", &n, &m); //两个链表元素的数量N、M,

    ListNode* mylist_1; ListNode* mylist_2; //定义两个链表
    mylist_1 = List_create();       //初始化链表
    mylist_2 = List_create();
    
    int student_number, score;

    for (int i = 0; i < n; i++) {
        scanf("%d %d", &student_number, &score);
        List_End_appendNode(&mylist_1, student_number, score);
    }    


    for (int i = 0; i < m; i++) {
        scanf("%d %d", &student_number, &score);
        List_End_appendNode(&mylist_2, student_number, score);
    }

    List_Link(&mylist_1, &mylist_2);    //链表拼接

    
    List_insertionSort(&mylist_1);    //根据student_number排序
    List_Print(mylist_1);                //打印

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »