解题思路:
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 人评分
简单的a+b (C语言代码)浏览:690 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:806 |
C二级辅导-公约公倍 (C语言代码)浏览:1550 |
2005年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:530 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:466 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:613 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:632 |
DNA (C语言描述,数据结构)浏览:909 |
C二级辅导-统计字符 (C语言代码)浏览:514 |
川哥的吩咐 (C语言代码)浏览:663 |