解题思路:
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语言代码)浏览:858 |
数组输出 (C语言代码)错误???浏览:602 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:504 |
C语言程序设计教程(第三版)课后习题6.11 (C语言代码)浏览:565 |
本人酷爱递归实现很多问题,这里也是浏览:632 |
【计算直线的交点数】 (C语言代码)浏览:1501 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:537 |
数字游戏 (C++代码)浏览:1240 |
C二级辅导-统计字符 (C语言代码)浏览:514 |
众数问题 (C语言代码)浏览:717 |