解题思路:
1、定义结构体(根据题干定义即可)
2、创建链表函数
3、输出链表函数
4、链表排序:
先讲两个链表合为一个链表,再通过选择排序的方式将链表重新排序
注意事项:
在合并原理原重新创建指针头,每次从原指针中挑出num最小的指针插入新指针中,如果原指针num最小为头指针,则需让a=a->next,反之丢失元素。
参考代码:
struct Linklist1052{
int num;
int score;
struct Linklist1052 *next;
};
struct Linklist1052 *create(int n){
struct Linklist1052 *p1,*p2;
struct Linklist1052 *head;
head=NULL;
p1=p2=(struct Linklist1052 *)malloc(sizeof(struct Linklist1052));
for(int i=0;i<n;i++){
scanf("%d %d",&p1->num,&p1->score);
if(i==0){
head=p1;
}else{
p2->next=p1;
}
p2=p1;
p1=(struct Linklist1052 *)malloc(sizeof(struct Linklist1052));
}
p2->next=NULL;
return head;
}
void print1052(struct Linklist1052 *head){
struct Linklist1052 *p;
p=head;
if(head!=NULL){
while(p!=NULL){
printf("%d %d\n",p->num,p->score);
p=p->next;
}
}
}
struct Linklist1052* pai1052(struct Linklist1052 *a,struct Linklist1052 *b,int n,int m){
struct Linklist1052 *p,*q,*head,*min,*minq,*newp;
head=NULL;
p=a;
while(p->next!=NULL){
p=p->next;
}
p->next=b;//连接两个链表
q=min=p=a;//初始化指针
for(int i=0;i<n+m;i++){//外层循环执行次数
p=a;//执行完一轮后p指针回到起点
q=minq=min=p;
while(p!=NULL){//寻找num最小指针
if(min->num>p->num){
min=p;
minq=q;
}
q=p;
p=p->next;
}
//首位最小则起始点改变
if(min==a){
a=a->next;
}
//解绑
minq->next=min->next;
if(i==0){
head=min;
}else{
newp->next=min;
}
newp=min;
}
newp->next=NULL;
return head;
}
int main(){
struct Linklist1052 *a,*b,*ab;
int n,m;
scanf("%d",&n);
scanf("%d",&m);
a=create(n);
b=create(m);
ab=pai1052(a,b,n,m);
print1052(ab);
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复