解题思路:
手搓链表,首先输入a,b链表,初始化一个together链表备用。
写一个函数minid找到链表中id最小的并返回该结点地址,考察a,b两链表中id最小者,并加入together链表同时修改该id为999,循环。
注意事项:
找到了当前id最小者结点地址要加入together链表时,并不能直接链接该地址,而是要拷贝一份,并且该拷贝的next指针为NULL
参考代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct student{
int id;
int score;
struct student* next;
}Snode;
Snode* init(){
Snode* temp=(Snode* )malloc(sizeof(Snode));
temp->next=NULL;
return temp;
}
void printnodes(Snode* x){
Snode* ttemp=x;
while(ttemp->next!=NULL){
ttemp=ttemp->next;
printf("%d %d\n",ttemp->id,ttemp->score);
}
}
Snode* minid(Snode* x){
int mintemp=x->next->id;
Snode* minp=x->next;
while(x->next!=NULL){
x=x->next;
if(mintemp>x->id){
mintemp=x->id;
minp=x;
}
}
return minp;
}
int main()
{
int N,M;
scanf("%d %d",&N,&M);
Snode* a=init();
Snode* b=init();
Snode* together=init();
for(int i=1;i<=N;i++){
Snode* temp=init();
scanf("%d %d",&temp->id,&temp->score);
Snode* ttemp=a;
while(ttemp->next!=NULL){
ttemp=ttemp->next;
}
ttemp->next=temp;
}
for(int i=1;i<=M;i++){
Snode* temp=init();
scanf("%d %d",&temp->id,&temp->score);
Snode* ttemp=b;
while(ttemp->next!=NULL){
ttemp=ttemp->next;
}
ttemp->next=temp;
}
for(int i=1;i<=N+M;i++){
Snode* temp=together;
while(temp->next!=NULL){
temp=temp->next;
}
Snode* minida=minid(a);
Snode* minidb=minid(b);
Snode* min=(minida->id)<(minidb->id)?minida:minidb;
Snode* ttemp=init();
ttemp->id=min->id;
ttemp->score=min->score;
temp->next=ttemp;
min->id=999;
}
printnodes(together);
free(a);
free(b);
free(together);
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复