注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.Right

不顾一切的去想,于是我们有了梦想。脚踏实地的去做,于是梦想成了现实。

 
 
 

日志

 
 
关于我

人生一年又一年,只要每年都有所积累,有所成长,都有那么一次自己认为满意的花开时刻就好。即使一时不顺,也要敞开胸怀。生命的荣枯并不是简单的重复,一时的得失不是成败的尺度。花开不是荣耀,而是一个美丽的结束,花谢也不是耻辱,而是一个低调的开始。

网易考拉推荐

阿英讲C语言两个有序链表合并  

2013-09-14 21:43:55|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
缘起: 谭浩强C语言第4版,习题9-10的答案没有注释以及画算法流程图,导致初学不容易掌握程序内部的因果关系。自己专门花了一晚上把此问题的执行步骤和注释加上,希望能节省大家的学习摸索时间。


第1次循环
 
阿英讲C语言两个有序链表合并 - 阿英 - Mr.Right
第2次循环
 阿英讲C语言两个有序链表合并 - 阿英 - Mr.Right

/*
101, 89
103, 67
105, 97
107, 88
0

100, 100
102, 65
106, 60
0
*/
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)

struct  student
{long num;
 int score;
 struct student *next;
};

struct student lista,listb;
int n,sum=0;

int main()
{struct student *creat(void);
 struct student *insert(struct student  *,struct student *);
 void print(struct student *);
 struct student *ahead,*bhead,*abh;
 printf("input list a:\n");
 ahead=creat();
 sum=sum+n;
 printf("input list b:\n");
 bhead=creat();
 sum=sum+n;
 abh=insert(ahead,bhead);
 print(abh);
 return 0;
}

struct student *creat(void)       //建立链表函数
 {struct student *p1,*p2,*head;
  n=0;
  p1=p2=(struct student *)malloc(LEN);
  printf("input number & scores of student:\n");
  printf("if number is 0,stop inputing.\n");
  scanf("%ld,%d",&p1->num,&p1->score);
  head=NULL;
  while(p1->num !=0)
    {n=n+1;
     if (n==1)
       head=p1; // 我以前没看出来head=p1本书中头结点里也有数据!  head->next=p1才是头结点无数据的情况
     else
       p2->next=p1; // 把p1纳入链表
     p2=p1; // p2是链表当前最后一个节点的指针
     p1=(struct student *)malloc(LEN);
     scanf("%ld,%d",&p1->num,&p1->score);
    }
    p2->next=NULL;
  return(head);
}
     
struct student *insert(struct student *ah,struct student *bh)   //插入函数
 {struct student * pa1,* pa2,* pb1,* pb2;
 //pa2始终指向pa1后面的一个节点,始终把pb2插入在pa2后面, 
 //故pa2可以是链表a中的节点也可以是链表b中的节点
  pa2=pa1=ah; 
  pb2=pb1=bh;
  do
  {while((pb1->num>pa1->num) && (pa1->next !=NULL))
     {pa2=pa1;
      pa1=pa1->next;
     }
    if (pb1->num <= pa1->num) //这个if不可以省略,因其条件不为while循环中的"补"
     {if (ah==pa1)
   ah=pb1;
      else 
pa2->next=pb1; // 把pb1放入pa2的后面, 此时pb1=pb2
 pb1=pb1->next; // pb1指向下一个链表b的节点,pb1不参加插入,仅其判断作用
 pb2->next=pa1; // 把pb2插入到pa1前面,原来的pa2后面,然后pa2=pb2; pb2=pb1
      pa2=pb2;
 pb2=pb1;
}
}while ((pa1->next!=NULL) || (pa1==NULL && pb1!=NULL)); //pa1==NULL指原链表a已经搜索完;pb1 != NULL表示链表b还有节点
    if ((pb1!=NULL) && (pb1->num>pa1->num) && (pa1->next==NULL)) // 链表a和链表b等长时要特殊考虑,我以前没想到
      pa1->next=pb1; //此种if情况由while(pa1->next!=NULL)漏出
    return(ah);
 }

void print(struct student *head)  //输出函数
  {struct student  *p;
   printf("There are %d records:  \n",sum);
   p=head;
   if (p !=NULL)
     do
       {printf("%ld %d\n",p->num,p->score);
   p=p->next;
       }while (p !=NULL);
   }
阿英讲C语言两个有序链表合并 - 阿英 - Mr.Right
 
  评论这张
 
阅读(774)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016