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);
    }
}

很《简单》吧!

记得点赞+关注哦

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值