已有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 ...
随机推荐
- Delphi For Android 开发笔记-附:如何Delphi中同时实现Windows、Android版的GetModuleFileName函数
在Windows中开发DLL时,经常会需要获取当前DLL所在目录以便读取同目录下的其他文件,而目前Delphi在开发android时,其实没多大必要获取,因为整个工程只有一个so文件,而这个so文件也 ...
- [JAVA][RCP] Eclipse4/RCP/Lifecycle
E4AP provides two levels of lifecycles, for contributions and for the application. Contents [hide] ...
- poj 1679 The Unique MST
题目连接 http://poj.org/problem?id=1679 The Unique MST Description Given a connected undirected graph, t ...
- spring 中的两个DaoSupport类的使用对比
可以利用NamedParameterJdbcDaoSupport 已经封装的NamedParameterJdbcTemplate方便的进行sql中参数的初始化工作. 相对于JdbcDaoSupport ...
- Oracle连乘聚合函数 MUL
Oracle提供了求和(SUM),平均值(AVG)等聚合函数,但没有提供连乘的聚合函数. 比如有一个表如下: ID NUM 1 4 2 2 3 2 如果要求NUM列的连乘数,即求: 4*2*2 ,目前 ...
- OSGi之Bundle
OSGi提出的根源是什么?在我看来就是对JVM的类加载机制进行了扩展,添加了一系列的规则,使得原有的类包(Class Package)扩展到类域(Class Domain).然后是建立在类域上的一系列 ...
- mysql查看日志
工具:mysqlbinlog, 在bin目录中日志在data目录中 日志过滤:mysqlbinlog mysql-bin.000011 | less mysqlbinlog mysql-bin.000 ...
- nodejs for centos配置
mongodb http://www.cnblogs.com/zhoulf/archive/2013/01/31/2887439.html nodejs http://zhaohe162.blog.1 ...
- EasyUI 兼容 IE6 方法总结
1.combobox 如果单选,multiple必须也设置为true.这个ie7如果没设置,会保持多选状态,算是一个bug. 2.combobox 最好用js来渲染,而不是一开始就class=“eas ...
- [DHCP服务]——DHCP详解
DHCP:(Dynamic Host Configuration Protocol) 动态主机配置协议 1. DHCP是一个局域网的网络协议,采用UDP协议工作 2. DHCP作用 (1)主要应用在大 ...