1175: 链表操作

题目描述

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

输入

第一行,a、b两个链表元素的数量N、M,用空格隔开。接下来N行是a的数据然后M行是b的数据每行数据由学号和成绩两部分组成

输出

按照学号升序排列的数据

样例输入

2 35 1006 893 824 952 10

样例输出

2 103 824 955 1006 89

没想到吧,今天是双更!!!

链表操作,第一次做的时候我也蒙了,说到链表,我就想起其他语言中的列表了

不知为什么我又想到物理中的链表了。。。

我们先来了解一下链表

一、链表的概念

定义:

链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构。

特点:

链表由一系列节点(链表中每一个元素称为节点)组成,节点在运行时动态生成 (malloc),每个节点包括两个部分:

一个是存储数据元素的数据域

另一个是存储下一个节点地址的指针域

举个例子

    typedef struct student{
     int num;
     char name[20];
     struct student *next;
     }STU;

这就是一个简单的链表

具体怎么使用可以看一下这个博客

https://blog.csdn.net/qq_61672347/article/details/125701955

我看了,我第一次做的时候也看了,没想到吧!

不多说了,又是刷题的日子,直接上AC代码

#include <stdio.h>
#include <malloc.h>
 
typedef struct Student
{
    int num;
    int grade;
    struct Student *next;
}*node,Node;
 
node a(int n);//创建链表
void sortf(node l1,node l2);//连接与排序
void print(node l);//输出
 void b(node l1,node l2)
{
    node q;
 
    q=l1;
    l2=l2->next;
 
    while(q->next!=NULL)
    {
        q=q->next;
    }
 
    q->next=l2;
    q=l1->next;
 
    node min,p;
    int t,n,g;
 
    while(q!=NULL)
    {
        p=q;
        t=p->num;
        min=p;
 
        while(p!=NULL)
        {
            if(p->num<t)
            {
                t=p->num;
                min=p;
            }
 
            p=p->next;
        }
 
        n=q->num;
        q->num=min->num;
        min->num=n;
        g=q->grade;
        q->grade=min->grade;
        min->grade=g;
        q=q->next;
    }
 
    print(l1);
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
 
    node head1,head2;
    head1=a(n);
    head2=a(m);
 
    b(head1,head2);
 
    return 0;
}
 
node a(int n)
{
    node h;
    h=(node)malloc(sizeof(Node));
    h->next=NULL;
 
    node p1=h,p2;
 
    int i;
    for(i=0;i<n;i++)
    {
        p2=(node)malloc(sizeof(Node));
        scanf("%d%d",&p2->num,&p2->grade);
 
        p2->next=p1->next;
        p1->next=p2;
        p1=p2;
    }
 
    return h;
}
 

 
void print(node l)
{
    l=l->next;
    node q;
    while(l!=NULL)
    {
        printf("%d %d\n",l->num,l->grade);
        q=l;
        l=l->next;
 
        free(q);
    }
}

很《简单》吧!

记得点赞+关注哦

每天更新,不要错过(可能一天多更哦,因为已经开学了,忙起来了,有的时候没更新,敬请谅解)

posted @ 2023-03-05 18:47  我爱OJ  阅读(33)  评论(0)    收藏  举报  来源