程序员考试补课笔记-第二十一天(完)

原创 2002年09月02日 09:06:00
  很快今天就是到补课结束的日子了,现在的心情真的一言难尽。所以我也费话少说了,因为我根本无法用文字来表达我现在的心情。在放学前老师也答应了我们,如果我们考上了程序员就请我们吃一餐。我一定要努力把这餐得到手,大家也努力喔,我看到时还感激都来不及了。
好,下面我就讲一下最后一天的补课情况。今天还是围绕着练习题为主,而且最都是有关链表的题目(我再三强调,链表是考试的重点)。看下程序:
  typedef struct elem
  {
    int val;
    struct elem *next;
  }intNode; /*一看定义这种结构就知道是链表了*/

  /*合并升序链表*/
  intNode *merge(intNode *a,intNode *b)
  {
    intNode *h=a,*p,*q;
    while(b)
    {
      for(p=h;p && p->val < b->val; q=p,p=p->next); /*注意这里又用到了双指针*/
      if (p= =h)____1____;else_____2____;
      q=b;b=b->next;____3_____;
    }
    return h ;
  }
  看题目知道这是两条链表要合成一个新的链表,那么参数当然也就是有两条链表了。这条程序也比较简单,只是考了我们对链表是否熟悉,在前几天的补课笔记里我已经讲了很多有关链表的知识了,所以不再赘述。我们来直接看看怎么填这些空
  if (p= =h)____1____;else_____2____;
  这里是特为处理如果合并时插入在头结点前的时候,原因嘛,那当然就是单向链表的特性了。从for循环里的条件p->val < b->val知道,当b->val小于p->val就插,所以我们要插的当然就是b指向的结点了。第一个空可以马上的写出h = b ,现在下面考虑不是插入头结点的情况。这个问题比较简单,这里运用了双指针,即q和p,这里q一定是p之前的一个结点,为什么要用双指针?这也是单向链表的缺点嘛。第二个空填 q->next = b ,下面q=b是把新结点为p之前的结点,b=b->next继续准备下一个待插入的结点,第三个空可以按链表的形式可以想出来该怎么填,其实就是没有把b->next指向它的下一个结点,不过我们之前已经把b=b->next移向了下一个结点,所以不能再用b->next=p了,不过还好q是在没有移之前把b的地址赋给了它,所以第三个空当然就是 q->next=p了。
  下面我们试着把这个程序改一改,在上面的程序里没有考虑到两条链表已经是排好序的特性,所以效率不高。看下程序:
  intNode *merge(intNode *a,intNode *b)
  {
    intNode *h=a,*p,*q;
    p=h; /*就是这里提前了,其它什么也没有动过*/
    while(b)
    {
      for(;p && p->val < b->val; q=p,p=p->next); /*注意这里又用到了双指针*/
      if (p= =h) h=b ; else q->next=b;
      q=b;b=b->next; q->next=p ;
    }
    return h ;
  }
  我们就是这么一移,整个程序的效率就提高了,这里是因为知道a已经是有序的了,程序就不必再从头开始搜索过a链表,直接在当前的位置继续往后比较就行了。
下面老师还写了另外一个程序,我们来看看
  intNode *merge(intNode *a,intNode *b)
  {
    intNode *h,*h1,*p,*q;
    if (a->val <= b-> val ){ h=a; h1=b }
    else {h=b; h1=a}
    for( p=h;p && h1;)
      if(h1->val<p->val)
      {
        q->next=h1;q=h;
        h1=h1->next;q->next=p;
      }
      else
      {
        q=p;p=p->next;
      }
    if (!p ) q->next =h;
  }
  这条程序是用一个循环就可以把两条链表合并起来了,至于整个程序的流程就由大家自已慢慢看一下,其实有几个地方也特别的妙。如果有什么更好的方法或者有什么问题的话,欢迎上来http://zhgpa.vicp.net 的交流论坛程序员考试专区里,把你的程序或者问题帖上去,我们大家一同研究,这样的学习方式总比自己一个人狐独的看好啊。
  补课也结束了,现在更多的时间在家里学习,也希望大家一同努力。总结一下这二十天的里的学习情况,总的来说真的学了不少东西,不过我还觉得浪费了一些时间在我下午的学习里,可能就是没人管吧,睡觉就成了我最好的理由不看书了。不过这几天一定不能让自己这样,今年的梦想就是考上程序员,我知道坚持就能把这个梦成真。

黑马程序员--- 学习笔记(第二十一天)

ObjectInputStream ObjectOutputStream 流构造的时候,必须有一个目的 直接操作对象数据的流 对象序列化(持久化) 要被流操作的对象必...
  • u012422158
  • u012422158
  • 2014年04月15日 16:12
  • 620

程序员,要不要考软考高级职称?

本篇文章的阅读对象为:1)三、四线城市的程序员,有项目但项目半死不活; 2)非计算机行业的信息中心岗位; 3)系统运维人员、网络管理人员; 4)非计算机专业转计算机相关工作。 如果你是一线城市...
  • wojiushiwo987
  • wojiushiwo987
  • 2016年05月21日 22:27
  • 31855

给程序员推荐一些提高工作效率的工具

http://www.itjhwd.com/gcxytjyg/ 给程序员推荐一些提高工作效率的工具 一些高效的软件可以给我带来高效的工作效率。下面一些工具推荐给大家。欢迎补充 一、Xshe...
  • zdy0_2004
  • zdy0_2004
  • 2014年10月28日 22:08
  • 1182

SUN_Java程序员认证考试题库(一)

第一章练习题(Java入门)      1.下列哪项不是JDK所包含的内容?(选一项)     A.Java编程语言     B.工具及工具的API     C.Java EE扩展API     D....
  • u013767488
  • u013767488
  • 2016年10月07日 15:39
  • 2206

50道java面试题 适用于准入职Java程序员

1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行...
  • huaieli1
  • huaieli1
  • 2017年11月20日 19:39
  • 141

第二十一天H5进阶

BOM- 浏览器对象模型 - BOM中为我们提供了一组对象,用来对浏览器的相关内容做操作 - 这些BOM对象,都是window对象的属性,可以在页面中直接使用 - BOM对象: - Windo...
  • qq_27280457
  • qq_27280457
  • 2017年05月25日 16:17
  • 152

黑马程序员学习笔记 Java的三大框架

如果做javaweb开发,spring是一定要学的,现在主流还是ssh,就是strurs+hibernate+spring,其中hibernate是持久层,用来持久化数据库操作的,如果不喜欢可以学点别...
  • Mr_April
  • Mr_April
  • 2015年07月03日 17:12
  • 1556

第二行代码学习笔记——第二章(2)

Android生命周期和启动模式
  • Android_03
  • Android_03
  • 2017年02月27日 20:03
  • 427

Sun_Java程序员认证考试题库

第一部分 基础知识练习 目标     本章对应于《学生指南》各章的内容分别提供了练习题集,包括:     ●  第一章Java入门     ●  第二章数据类型和运算符     ●  第三...
  • slny1921394421
  • slny1921394421
  • 2016年07月22日 18:58
  • 2120

黑马程序员--第二十一天:io流的第四天

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------   //21-1 impor...
  • F781492604
  • F781492604
  • 2013年06月13日 22:27
  • 259
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员考试补课笔记-第二十一天(完)
举报原因:
原因补充:

(最多只允许输入30个字)