解题思路:
手搓链表,首先输入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语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:724 |
字符串的输入输出处理 (C语言代码)浏览:1018 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:723 |
1011题解浏览:819 |
C语言程序设计教程(第三版)课后习题12.3 (C语言代码)浏览:587 |
简单的a+b (C语言代码)浏览:683 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:584 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:611 |
C语言训练-斐波纳契数列 (C语言代码)浏览:644 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:518 |