题目描述
已有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);
}
}
很《简单》吧!
记得点赞+关注哦
每天更新,不要错过(可能一天多更哦,因为已经开学了,忙起来了,有的时候没更新,敬请谅解)