已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列
1.我的思路先将b链表连接在a链表的后面,这个很容易实现,将a链表最后的结点中的p.next改为指向b链表的头结点即可。
再将这个新链表用选择排序即可。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h> typedef struct student{
int num;
float score;
struct student *next;
} STU; int main(){
setbuf(stdout,NULL);
STU *creat();
void print(STU *head);
STU *head_a,*head_b,*p1,*p2,*pmin;
int num_temp;
float score_temp;
printf("Input the records of a:\n");
head_a=creat();
printf("a:\n");
print(head_a);
printf("Input the records of b:\n");
head_b=creat();
printf("b:\n");
print(head_b);
for(p1=head_a;p1!=NULL;p1=p1->next) //27~29行连接两个链表。
p2=p1;
p2->next=head_b; printf("After connected:\n");
print(head_a); for(p1=head_a;p1->next!=NULL;p1=p1->next)
{
pmin=p1;
for(p2=p1->next;p2!=NULL;p2=p2->next)
if(p2->num<pmin->num)
pmin=p2;
if(pmin!=p1)
{
num_temp=p1->num;
p1->num=pmin->num;
pmin->num=num_temp; score_temp=p1->score;
p1->score=pmin->score;
pmin->score=score_temp;
}
}
printf("After sorted:\n");
print(head_a);
return ;
} STU *creat(){
STU *p1,*p2,*head=NULL;
int n=;
p1=(STU *)malloc(sizeof(STU));
p2=p1;
scanf("%d%f",&p1->num,&p1->score);
while(p1->num!=)
{
n++;
if(n==)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(STU *)malloc(sizeof(STU));
scanf("%d%f",&p1->num,&p1->score);
}
p2->next=NULL;
return head;
} void print(STU *head){
STU *p1;
if(head==NULL)
{
printf("NULL list!\n");
return;
}
else
{
for(p1=head;p1!=NULL;p1=p1->next)
printf("%d,%.2f\n",p1->num,p1->score);
}
}
注意事项:
1.用选择法进行排序的过程中,需要交换两个结点时,注意只能交换结点中的有用数据,结点中的next成员不能变动,否则会影响链表的连接关系;
2.建立链表的函数中,head一定要初始化为NULL。否则当建立的链表为空链表时,return head返回的值为不确定的值。
程序的执行结果如下:
Input the records of a: a:
,85.00
,96.00
,75.00
Input the records of b: b:
,96.00
,75.00
,96.00
After connected:
,85.00
,96.00
,75.00
,96.00
,75.00
,96.00
After sorted:
,96.00
,85.00
,75.00
,96.00
,96.00
,75.00
2.谭浩强答案书上时这样处理的:
STU *insert(STU *head_a,STU *head_b){
STU *pa1,*pa2,*pb1,*pb2;
pa2=pa1=head_a;
pb2=pb1=head_b;
do{
while((pb1->num>pa1->num)&&(pa1->next!=NULL))
{
pa2=pa1;
pa1=pa1->next;
}
if(pb1->num<=pa1->num)
{
if(head_a==pa1)
head_a=pb1;
else
pa2->next=pb1;
pb1=pb1->next;
pb2->next=pa1;
pa2=pb2;
pb2=pb1;
}
}while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));
if((pb1!=NULL)&&(pb1->num>pa1->num)&&(pa1->next==NULL))
pa1->next=pb1;
return(head_a);
}
将a链表和b链表传递给函数insert,函数的算法是将b链表中的结点依次插入a链表中,插入的时候按照学号的顺序。算法的细节我还没有理解。
已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列的更多相关文章
- 已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并。按学号升序排列.
#include <stdio.h>#define SIZE sizeof(struct student)struct student{ long num; flo ...
- [PHP] 算法-请找出带环链表的环的入口结点的PHP实现
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...
- 35.两链表的第一个公共结点[Find the first common node of two linked list]
[题目] 两个单向链表,找出它们的第一个公共结点. 链表的结点定义为: C++ Code 123456 struct ListNode { int m_nKey; ...
- 九度OJ 1505 两个链表的第一个公共结点 【数据结构】
题目地址:http://ac.jobdu.com/problem.php?pid=1505 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例. 对于每个测试案例, ...
- 【剑指offer】面试题37:两个链表的第一个公共结点
题目: 输入两个链表,找出它们的第一个公共结点. 思路: 由链表的定义知是单链表.对于单链表,如果两个链表有公共结点,则两个链表必然是像Y型相交.则先计算出各个链表的长度,让长链表的头指针先走多出来的 ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- [PHP] 算法-找出两个链表的第一个公共结点的PHP实现
输入两个链表,找出它们的第一个公共结点 1.两个单链表,有公共结点,那么必然,尾部公用 2.找出链表1的长度,找出链表2的长度,长的链表减去短的链表得出一个n值 3.长的链表先走n步,两个链表再同时移 ...
- 【Java】 剑指offer(52) 两个链表的第一个公共结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两个链表,找出它们的第一个公共结点. 思路 蛮力法:遍历第一个 ...
- 《剑指offer》第五十二题(两个链表的第一个公共结点)
// 面试题52:两个链表的第一个公共结点 // 题目:输入两个链表,找出它们的第一个公共结点. #include <iostream> #include "List.h&quo ...
随机推荐
- apache2反向代理node.js应用
在之前记录的随笔中,只是介绍了怎么在apache2中使用proxy模块,后来查到了一些资料,可以通过下面网址查看配置块的详细参数信息 http://man.ddvip.com/soft/apache2 ...
- java-servlet-jsp
=========================servletjavax.servlet javax.servlet.http javax.annotation javax.ser ...
- printf输出格式总结
printf函数称为格式输出函数,其关键字最末一个字母f即为"格式"(format)之意.其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上. printf函数调用的一般形式 ...
- DB2递归查询
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...
- IE浏览器各版本的CSS Hack
IE浏览器各版本的CSS Hack 如下示例: .test{ color:black;/*W3C*/ color:red\9;/* IE6-IE10 */ _color:black;/*IE6*/ ...
- Node.js:util.inherits 面向对象特性【原型】
/** * Created by Administrator on 2014/9/4. */ var util = require('util'); function Base() { this.na ...
- 使用Apriori算法和FP-growth算法进行关联分析
系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...
- 深入浅出TCP/IP簇
TCP/IP是“transmission Control Protocol/Internet Protocol”的简写,中文译名为传输控制协议/互联网络协议.TCP/IP不是一个协议,而是一个协议簇的 ...
- 42.JTAG接口使用注意
无论是客户反馈,还是自己亲身经历,USB-Blaster不能下载配置FPGA的情况时有出现.究其原因,大致有如下几条: 1. FPGA器件上的JTAG相关引脚出现故障: 2. USB-Blaster坏 ...
- 在VS2010中ActiveX控件注册方法,使用regsvr32命令
上一篇小编展示了如何设置VS2010自带的ActiveX控件的容器测试程序,现在为大家演示一下如何注册ActiveX控件. 首先简单了解一下ActiveX控件的知识,ActiveX控件:简单来说,就是 ...