原题链接:[编程入门]链表合并
解题思路:
1.输入
2.创建a链表
3.输出a链表看一下输入对不对
4.创建b链表
5.输出b链表看一下输入对不对
6.连接a,bl链表
7.冒泡排序
8.输出连接后的整个链表+释放链表
如有错误请包涵(第一次发这么认真的题解)我是小白呀,呀呀!逃~
注意事项:
参考代码:
#include<stdio.h>
#include<stdlib.h> // malloc函数的头文件
typedef struct node
{
int id;
int score;
struct node* next;//存放下一个节点(类型为 node )的地址,所以指针类型为 node
}Node;
int main()
{
int n,m;
Node *p , *p1 , *p2 , *head1 , *head2 , *q1 , *q2;
/*
p是存放链表 动态创建的node类型节点的地址
head是存放链表的首地址
q是指向当前节点的地址
*/
scanf("%d%d",&n,&m); //输入两个链表分别有多少个节点
p1 = (Node*)malloc(sizeof(Node)); // 动态生成一个首节点(node类型的结构体)
//并把节点的地址赋值给p1,及p1指向首节点
head1 = p1; //把首节点的地址放给head1只要通过head1就可以遍历a链表
q1 = p1; // q1指向当前节点
scanf("%d%d",&p1->id,&p1->score);//输入学号 成绩
p1->next = NULL; //把p1的next 指针赋空(相当于标记 便于链表的遍历)
for(int i = 1;i < n ; i++){ //动态生成n-1个节点 (前面已经创建了一个)
p1 = (Node*)malloc(sizeof(Node)); //动态生成一个节点(node类型的结构体)并把节点的地址赋值给p1
scanf("%d%d",&p1->id,&p1->score); //输入学号 成绩
p1->next = NULL; //把p1的next 指针赋空(相当于标记 便于链表的遍历)
q1->next = p1; //首先要明确此时q1指向的是当前的节点,而p1指向的是新创建的节点,
//要想使新的节点连接到之前的链表中,
//只要把p1(新的节点的地址)的地址赋值给q1(当前节点的地址)的next(指向下一个节点的地址),
//即q1指向新节点(新节点与之前的那一段链表连接上了)
q1 = p1; //因为新节点连接成功所以,新节点是变成了当前节点,
//所以把新节点的地址(p1)赋值给q1(始终指向当前节点)
}
/*
p=head1;
cout<<"1*****"<<endl;
while(p!=NULL){
printf("%d %d\n",p->id,p->score);
p=p->next; //这是一段链表输出的代码,看一下链表生成的对不对
}
cout<<"1*****"<<endl;
*/
p2 = (Node*)malloc(sizeof(Node)); //跟上面的是一样的所以就偷懒了
head2 = p2;
q2 = p2;
scanf("%d%d",&p2->id,&p2->score);
p2->next = NULL;
for(int i = 1 ; i < m ; i++){
p2 = (Node*)malloc(sizeof(Node));
scanf("%d%d",&p2->id,&p2->score);
p2->next = NULL;
q2->next = p2;
q2 = p2;
}
/*
p=head2;
cout<<"2*****"<<endl;
while(p!=NULL){
printf("%d %d\n",p->id,p->score);
p=p->next;
}
cout<<"2*****"<<endl;
*/ //跟上面的是一样的所以就偷懒了
q1->next = head2; //要想连接两链表只需要把 b 链表 的指针赋值给 a链表
//最后一个节点中的next指针(next指向了b链表,这样就连接成功了)
// 链表的排序--冒泡排序
p1 = head1;
p2 = head1;
int t;
for(int i = 1 ; i < n+m ; i++){
for(int j = 1 ; j <= n+m-i ; j++){
p2 = p2->next; //没做一次就指向下一个节点有点像冒泡里面的 j++;
if(p1->id>p2->id){ //当p1指向的学号大于p2指向的学号则交换
t = p2->id;
p2->id = p1->id; //交换学号
p1->id = t;
t = p2->score;
p2->score = p1->score; //交换成绩
p1->score = t;
}
}
p1 = p1->next; //没做一次就指向下一个节点有点像冒泡里面的 i++;
p2 = p1; //使p2指针前移
}
//链表输出 + 链表释放
p = head1;
Node *h; //释放节点的指针
while(p != NULL){
printf("%d %d\n",p->id,p->score); //输入学号 成绩
h = p;
p = p->next; //当把p的地址赋值给h指针后,指向下一个节点
free(h); //释放h节点(此时p的上一个节点)
}
return 0;
}-------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------
无注释
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int id;
int score;
struct node* next;
}Node;
int main()
{
int n,m;
Node *p,*p1,*p2,*head1,*head2,*q1,*q2;
scanf("%d%d",&n,&m);
p1 = (Node*)malloc(sizeof(Node));
head1 = p1;
q1 = p1;
scanf("%d%d",&p1->id,&p1->score);
p1->next = NULL;
for(int i = 1 ; i < n ; i++){
p1 = (Node*)malloc(sizeof(Node));
scanf("%d%d",&p1->id,&p1->score);
p1->next = NULL;
q1->next = p1;
q1 = p1;
}
p2 = (Node*)malloc(sizeof(Node));
head2 = p2;
q2 = p2;
scanf("%d%d",&p2->id,&p2->score);
p2->next = NULL;
for(int i=1;i<m;i++){
p2 = (Node*)malloc(sizeof(Node));
scanf("%d%d",&p2->id,&p2->score);
p2->next = NULL;
q2->next = p2;
q2 = p2;
}
q1->next=head2;
p1 = head1;
p2 = head1;
int t;
for(int i = 1 ; i < n+m ; i++){
for(int j = 1;j <= n+m-i ; j++){
p2 = p2->next;
if(p1->id > p2->id){
t = p2->id;
p2->id = p1->id;
p1->id = t;
t = p2->score;
p2->score = p1->score;
p1->score = t;
}
}
p1=p1->next;
p2=p1;
}
p = head1;
Node *h;
while(p != NULL){
printf("%d %d\n",p->id,p->score);
h = p;
p = p->next;
free(h);
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复