程序员考试补课笔记-第十六天

原创 2002年08月16日 10:41:00
今天继续是链表方式的排序,前天的一题大家有没有弄懂了。弄不懂不要紧,这是要慢慢来的,急不来。
p=h->next;h->next=NULL;
  while(p)
  {
    if(p->data<h->data)
    {
      q=p->next;
      p->next=h;
      h=p;p=q;
    }
    else
    {
      q=h;r=q->next;
      while(r && p->data > r->data)
      {
        q=r;r=r->next;
      }
      q->next=p;p=p->next;
      q->next->next=r;
    }
  }
  按照这条程序的思路让我们来想想整个的过程,这个程序分了两部份,一部分就是如果当前待排序的结点值是小于头的结点值就直接把它插到第一个里,因为如果对比头的那个已经小于它了,所以后面的都不要比较了。如果待插入排序的结点值不是小于当前头结点的话,那么就应该要找到合适的位置才可以插入该结点了,我们来看q和r指针是用来做什么来的,它指向头指针h和r指向q指针的一下个结点,因为我们知道单向链表的缺点是不能知道它前面的结点是什么,所以一断开就可能会导至链表失败。我们的目的就是用q来保存它的前一个结点。在while循环里就是有两种可能,一种是r为空,这里r为空时就是说明了这个链表已经比到最后一个了,所以直接把待插入的结点插在后面就行了。至于p->data>r->data是要等p->data比r->data小时就说明已经找到该插入的位置里,我们就可以继续往下进行插入的步骤。while里面的是如果这两个条件都是真的时候说明还没有找到,那么就让两个双链指针往后移一个继续比较,等找到符合了就可以插入了。
如果还是比较模糊的话大家不要紧,再看看下面这条程序:
struct node *li_sort(struct node *h)
{
  struct node *t,*s,*u,*v;
  s=h->next;
  h->next=NULL;
  while(s!=NULL)
  {
    for(t=s,v=h;v!=NULL && v->data < t->data; u=v,v=v->next);
      s=s->next;
    if(v==h) h=t;
    else u->next=t;
    t->next=v;
  }
}
  我们可以看出这个程序很像上面的,但它更简化了,把整个判断都在一个for语句里了。我们慢慢来分析一下这个程序,相信只有去想的话大家应该都会明白的了。S=h->next 和h->next=NULL这两句都是同上一样,把他们分开成已排序部份和待排序部份。跟着主要的是要看看for语句里的,因为所有判断条件都在这里了。这里t是临时变量代s的,s的角色就是当前要插入的那个结点,v和u指针都和上面一程序的q和r是一样的,都是用来补缺单向链表的缺点。这里的条件也是一样,和上面程序的分别就是它整合了两种情况的可能性在,跟着下面的程序又作了一个条件来分别这是插入头的还是中间的。好了,还是一句要自己的脑根去想,16day1.gif这里第十六天图一里有整个的过程。
  说完了单向链表的当然就是要讲讲双向链表了,因为双向链表可以往前移的关系,所以程序也比较好办,不过麻烦的就是它的插入和删除操作,也当再一次练习链表操作的机会吧。大家先自己想想,再试着写出程序来,有了上面单向链表的基础应该也很容易可以跟着思路编出。大家把编好的程序发到http://zhgpa.vicp.net/bbs 程序员考试那版里,看看大家的方法有何不同一齐讨论。大家先不要看我下面的程序:
一些定义略
while(p)
{
  for(q=p->pre,r=p;q && p->data < q->data; q=q->pre);
  p=p->next;
  r->pre->next=p;
  if (p) p->pre=r->pre;
  if(q)
  {
    p->next=q->next;
    if(q->next) q->next->pre=p;
    p->pre=q;
    q->next=p;
  }
  else
  {
    r->next=h;
    r->pre=NULL;
    h->pre=r;
  }
}
  好了,大家的程序又是如何呢?希望大家多多讨论。这几天虽然学的内容不算多,但是就从中吸受到很多经验,现在链表的操作又更一步的前进了。懂得了分析程序的一些方法,编程这条路看起来真的很漫长,我在这条路里我什么都不懂,可是我会坚持。

程序员考试补课笔记

程序员考试补课笔记huoniaolinx  http://www.cnitexam.com 第一天  今天是第一天补课,终于有又机会可以听到林老师的课了,我觉得他比老潭说得还要好呢,虽然我没有听过老潭...
  • bhwshx
  • bhwshx
  • 2009年02月17日 13:19
  • 946

程序员考试补课笔记-第十七天

离上一次的补课时间看起来有整整的五天,但是在我眼里只是短短的几眨眼。因为我这几天里脑海里根本没有什么事情发生过似的,每天过着重复而简单的生活。怎样简单法?那那当然就是坐在电脑前啦,可以说一坐就坐上了整...
  • Gpa
  • Gpa
  • 2002年08月21日 09:41
  • 1028

程序员考试补课笔记-第十九天

大家应该没有忙了今天是什么节日了吧?我想大家应该没有吧。因为这是我小时候最刺激的时候了,因为我和我的兄弟们都忙着准备那晚的东西,在街上捡些石头啊,线子啊,木棒啊。有什么用?当然就是用来打鬼的啊!(我们...
  • Gpa
  • Gpa
  • 2002年08月26日 11:44
  • 1081

noteBook2.16-C#基础第十六天

进程类 计算机中每一个程序都是一个进程,一个进程又由多个线程组成; 单线程带来的问题:程序假死(程序未结束则不能操作下一步)用多线程解决; 在.Net下,不允许跨线程访问; Process  ...
  • cylar__gg
  • cylar__gg
  • 2017年10月26日 15:24
  • 42

程序员考试补课笔记-第三天

很快的就到了第三天了,接下来的学习任务应该越来越重了。至于今天讲了些什么,现在想起来也觉得没有什么似的,可能因为我之前已经把这今天所讲的内容搞懂搞透的原因吧。不过也得把今天的写下来,也没有什么特别原因...
  • Gpa
  • Gpa
  • 2002年08月15日 18:46
  • 771

程序员考试补课笔记-第十三天

  今天特别的兴奋,起床也起得特别的早。在走之前我把电脑开了,那当然是为了做服务器,我不知道我开学后能不能够这样做,因为家里的一些因素。不过只要能为大家服务我已经很开心了,而且也一种强激的幸福感,这种...
  • Gpa
  • Gpa
  • 2002年08月16日 10:49
  • 913

六天带你玩转Mysql笔记--第六天

六天带你玩转Mysql笔记--第六天 1. 事务安全 1.1 事务操作 1.1.1手动事务操作流程 1.1.2 事务操作原理 1.1.3 回滚点 1.1.4 自动事务处理 1....
  • zwh847021940
  • zwh847021940
  • 2017年04月04日 10:51
  • 715

程序员考试补课笔记-第十天

今天接着上天的二维数组,我们看看指向二维数组的指针是怎么的。在讲之前我想再重复一次,如果你自己理解好二维数组的就按你以往的去理解吧。不过多想想几种方法也是一件好事,那么下面就来讲讲了。  现在来看看昨...
  • Gpa
  • Gpa
  • 2002年08月16日 10:55
  • 836

程序员考试补课笔记-第八天

今天回到学佼也没有讲课,因为老师忙着一些其它事,听说好像是多媒体比赛的吧,要今天上交了。那我们只好回到课室里自己看书了,不过在这段时间里我们都没有看什么书,只是大家聊了起来。我也插了嘴吹了几句,可是很...
  • Gpa
  • Gpa
  • 2002年08月16日 11:02
  • 757

程序员考试补课笔记-第十八天

  什么都不用说了,马上入正题(免得给人说我口水多了,哈哈)。那么今天学了些什么呢?知识当然每天都要吸收,但在乎吸收得多少。有时候一个看起来的小问题,其实足可以引发另一些问题,这一切都是靠自己,看自己...
  • Gpa
  • Gpa
  • 2002年08月23日 09:46
  • 2890
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员考试补课笔记-第十六天
举报原因:
原因补充:

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