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两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列的更多相关文章

  1. 已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并。按学号升序排列.

    #include <stdio.h>#define SIZE sizeof(struct student)struct student{       long num;       flo ...

  2. [PHP] 算法-请找出带环链表的环的入口结点的PHP实现

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...

  3. 35.两链表的第一个公共结点[Find the first common node of two linked list]

    [题目] 两个单向链表,找出它们的第一个公共结点. 链表的结点定义为:  C++ Code  123456   struct ListNode {     int         m_nKey;    ...

  4. 九度OJ 1505 两个链表的第一个公共结点 【数据结构】

    题目地址:http://ac.jobdu.com/problem.php?pid=1505 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例. 对于每个测试案例, ...

  5. 【剑指offer】面试题37:两个链表的第一个公共结点

    题目: 输入两个链表,找出它们的第一个公共结点. 思路: 由链表的定义知是单链表.对于单链表,如果两个链表有公共结点,则两个链表必然是像Y型相交.则先计算出各个链表的长度,让长链表的头指针先走多出来的 ...

  6. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  7. [PHP] 算法-找出两个链表的第一个公共结点的PHP实现

    输入两个链表,找出它们的第一个公共结点 1.两个单链表,有公共结点,那么必然,尾部公用 2.找出链表1的长度,找出链表2的长度,长的链表减去短的链表得出一个n值 3.长的链表先走n步,两个链表再同时移 ...

  8. 【Java】 剑指offer(52) 两个链表的第一个公共结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个链表,找出它们的第一个公共结点. 思路 蛮力法:遍历第一个 ...

  9. 《剑指offer》第五十二题(两个链表的第一个公共结点)

    // 面试题52:两个链表的第一个公共结点 // 题目:输入两个链表,找出它们的第一个公共结点. #include <iostream> #include "List.h&quo ...

随机推荐

  1. IOS学习4

    ---恢复内容开始--- UIScrollView 屏幕展示有限,超出一个屏时用户可滚动查看过多部分.UIView不具备滚动功能. -取消autolayout -设置CGSize contentSiz ...

  2. 一个封装好的CSV文件操作C#类代码

    using System.Data; using System.IO; namespace DotNet.Utilities { /// <summary> /// CSV文件转换类 // ...

  3. MHA命令系统介绍 --masterha_master_switch

    常用参数介绍 --master_state=dead 强制的参数,参数值为"dead" 或者 "alive" . 如果 设置为 alive 模式,masterh ...

  4. 用O(1)的时间复杂度,找到栈和队列中的最小(大)值

    最近刷剑指offer,看到两道编程题,考察在O(1)的复杂度内,找出最值. 觉得很有意思,很有借鉴意义,故记录在此. 需要注意的是,这里所说的O(1) 有个前提, 就是已经通过某种容器的存储方式进行初 ...

  5. next permutaion算法

    算法描述: Find largest index i such that array[i − 1] < array[i]. Find largest index j such that j ≥ ...

  6. VPN错误800、错误789

    VPN突然无法连接解决方法: 1. 单击“开始”,单击“运行”,键入“regedit”,然后单击“确定” 2. 找到下面的注册表子项,然后单击它:HKEY_LOCAL_MACHINE\System\C ...

  7. Node.js 异步模式浅析

    注:此文是node.js实战读后的总结. 在平常的脚本语言中都是同步进行的,比如php,服务器处理多个请求的方法就是并行这些脚本.多任务处理,多线程等等.但是这种处理方式也有一个问题:每一个进程或者线 ...

  8. oracle自定义job名字,job调度

    一.调试创建 begin -- create_schedule dbms_scheduler.create_schedule(schedule_name => 's_change_send_da ...

  9. Hadoop和大数据:60款顶级大数据开源工具

    一.Hadoop相关工具 1. Hadoop Apache的Hadoop项目已几乎与大数据划上了等号.它不断壮大起来,已成为一个完整的生态系统,众多开源工具面向高度扩展的分布式计算. 支持的操作系统: ...

  10. MySQL使用rand函数实现随机数[转]

    如何写一个语句能一下更新几百条MYSQL数据! 需要测试MYSQL数据库,里面有一个上万条数据的数据库,如何写一个PHP文件一下每次更新几百条信息,我都是写一个循环一次更新一条信息,这样我知道用WHI ...