留言簿程序的编写

2016-02-19 13:25 11 1 收藏

今天图老师小编给大家精心推荐个留言簿程序的编写教程,一起来看看过程究竟如何进行吧!喜欢还请点个赞哦~

【 tulaoshi.com - 编程语言 】


  
  1、构造留言簿的结构
      一个留言必不可少的是内容、其次是留言的日期和时间。和们就按这两点定义留言记录的结构。
  strUCt record
  {
      struct date t_date;        /*留言日期*/
      struct time t_time;        /*留言时间*/
      char event[100];           /*留言内容*/
      struct record *next;       /*指向下一个节点的指针*/
  };
  在上结构的定义中,用字符串event[100]存放留言内容,结构成员t_date存放留言的日期,t_time存放留言的时间。结构data和time的定义是Turbo C提供的。它们的定义分别如下所示:
  struct date
  {
      int da_year;
      char da_day;
      char da_mon;
  };
  struct time
  {
      unsigned char ti_min;
      unsigned char ti_hour;
      unsigned char ti_hund;
      unsigned char ti_sec;
  };
  2、入队操作
      入队操作比较简单,只要能找到队列的最后一个节点(即尾节点)修改尾节点的指针域,让其指针指向新增加的节点即可。于是问题的要害就在于如何找到尾节点,或是找到尾节点的指针域。
      这里采用设置头节点和尾指针的方法来完成入队操作。
      队列在还没有任何一条记录时称为队空。此时我们在队列中设置一个不存放任何记录的节点,称为“头节点”(采用头节点的好处在以后会体现出来),由于并无记录,我们设置的指向队尾的尾指针也指向这个头节点。
      一旦需要添加记录,就让尾指针指向新节点(称为节点1),而后把节点1的指针域赋给尾指针。由于尾指针为头节点的指针域,这样含头节点就链接了节点1,即头节点的指针指向节点1,形成了链的初始模型。当增加第二个节点(称为节点2)时,仍然修改尾指针,让其指向节点2,而后把节点2的指针域赋给尾指针。由于原来尾指针为节点1的指针域,因此节点1和节点2又链接在一起。现在的队列由头节点、节点1和节点2相互链接而成。依此类推,链队就通过修改尾指针的值形成了。
      入队操作的基本算法如下所示:
  void queue_add(struct element *rear,struct element *p)
  {
      p-next=NULL;
      rear-next=p;
      rear=p;
  }
      其中rear即为尾指针,而指针p指向新增的节点。算法的流程和上述完全一样。
  录入留言记录的函数代码如下所示:
  void Data_Input(struct record *p)
  {
      struct data *d;
      struct time *t;
      front++;
      getdate(t);        /*取系统时间*/
      p-t_time.ti_hour=ti_hour;
      p-t_time.ti_min=ti_min;
      p-time.ti_sec=ti_sec;
      printf("Date:%4d %2d %2d",p-t_date.da_year,p-t_date.da_mon,p-t_date.da_day);
      printf("Time: %2d: %2d: %2d",p-t_time.ti_hour,p-t_time.ti_min,p-t_time.ti_sec);
      printf("Please input record:");
      gets(p-event);      /*输入留言内容*/
      p-next=NULL;
  }
      上述函数中,采用了getdate()和gettime()两个函数用来获取系统的日期和时间。这两个函数只返回指向当前日期和时间的两个指针,还需要将值立即赋给留言记录中的结构成员。
  3、出队操作---留言记录的删除
      和入队操作相反的是出队操作,即在队头将记录删除,这也是符合“先进先出”的原则的。
      由于设置了头节点,因此出队操作显得非常简单。只需要修改头节点的指针域,让其指向第二个节点即可。而第一个节点则将其释放掉。其余节点,包括尾指针都不必做任何修改操作。
      例如一个队列原本由头节点、节点1和节点2相链而成,执行出队操作时,相当于将头节点和节点1、节点1和节点2之间的两条链断开,而用断链将头节点和节点2链上,多出来的节点1将其释放掉。
      典型的出队操作算法如下:
  void queue_delete(struct element head)
  {
      struct element *temp;
      temp=head.next-next;
      head.next=temp;
  }
      在执行出队操作时,一定要记住需要将出队的节点释放。由于采用链式存储,事先无法估计需要多大的存销售市场空间,也不必去估计。每次新增一个节点时,都是调用内存分配函数为新节点申请一块内存,如下所示:
      p=malloc(sizeof(struct record)
       函数malloc开辟了一块大小为record 结构元素的内存区域,把掻向该区域的指针赋给指针p,这块内存单元的所有权就从系统转移到了指针p。当p指向的数据元素被删除(出队)时,一定要用如下方式将内存单 所有权还给系统:
      free(p);
      函数free()的作用和malloc()刚好相反,它将指定的内存单元还给了系统。因为系统的内存单元是有限的,假如不及时释放占用的内存,会造成内存资源耗尽或由于内存的减少导致程序执行速度下降。
  4、记录的存取的读取
  void Data_Save(struct record *p)      /*记录文件的存取*/
  {
      int j;
      fp=fopen(tele_rec.txt","w");      /*以可写方式打开记录文件*/
      while(p!=NULL)        /*若未到队尾,徨将记录存储到文件中*/
      {
          fwrite(p.sizeof(struct record),1,fp);
          p=p-next;
      }
      fclose(fp);        /*关闭指定的文件*/
  }
  struct event *Data_Load()        /*从记录文件中读取记录*/
  {
      long k;
      struct record *p,*q;
      p=event_head.next;
      fp=fopen("tele_rec.txt","r+t");        /*以读方式打开记录文件*/
      if(fp!=NULL)
      {
          while(!feof(fp))        /*依次读取记录并执行入队操作*/
          {
              fread(q,sizeof(struct record),1,fp);
              p-next=q;        /*这里p为尾指针,q为指向新节点的指针*/
              p=q;
          }
          p-next=NULL;
          event_end=p;
      }
      else
      {
          fp=fopen("tele_rec.txt","w");    /*若文件不存在,创建指定文件名的新文件*/
          event_head.next=NULL;
          event_end=event_head.next;
      }
  }
  
  
  /*-------------留言簿代码如下-------------*/
  #includestdio.h
  #includeconio.h
  #includedos.h
  struct record
  {
      struct date t_date;        /*定义留言日期*/
      struct time t_time;        /*定义留言时间*/
      char event[100];           /*定义电话内容*/
      struct record *next;       /*指向下一个节点的指针*/
  }event_head;
  
  struct record *event_end;
  int front;
  FILE *fp;
  
  void Data_Save(struct record *p)        /*记录文件的存储*/
  {
      int j;
      fp=fopen("tele_rec.txt","w");       /*以可写方式打开记录文件*/
      while(p!=NULL)  
  

来源:http://www.tulaoshi.com/n/20160219/1604173.html

延伸阅读
标签: ASP
  在前面我们介绍了文件版本的留言簿,现在我们不妨来设想一下:如果留言文件里面的留言很多,而你又急于想寻找其中的某条留言时,这时打开txt留言文件,对着一段段的留言记录,你敢担保你不会当场晕倒吗?而且文件留言簿最令人讨厌还远不只是这个原因,更气人的是:譬如你已经找到了你要找的留言,而且是非要将其删除不可(当然是因为那...
标签: ASP
  从本章开始我们将由一个简单的,利用文件储存访问留言的留言簿程序进入我们的教程。编写这样一个留言簿,我们大致可以从以下三个步骤来完成。 步骤一:先设计一个留言表单的网页(如:guestbook1.asp,这不用我在这儿说教了吧?)。见下图:   步骤二:在设计好留言表单后,我们开始进行编写处理留言的ASP程序。 我们...
标签: ASP
在前面我们介绍了文件版本的留言簿,现在我们不妨来设想一下:如果留言文件里面的留言很多,而你又急于想寻找其中的某条留言时,这时打开txt留言文件,对着一段段的留言记录,你敢担保你不会当场晕倒吗?而且文件留言簿最令人讨厌还远不只是这个原因,更气人的是:譬如你已经找到了你要找的留言,而且是非要将其删除不可(当然是因为那段留...
标签: ASP
为了能使我们做出来的留言簿更美观,让我们来给上一章的简单留言簿润下色,再令其留言在另外的一个单独的页面显示。 那么怎样给该留言簿润色呢?留言表单界面的背景总不能没吧?而且为了让留言表单的内容显示得更加规整,我们是否有必要用框架将留言表单的内容框起来呢?想好了,现在就让我们立即动手给我们的留言簿粉饰刷新。 步骤一...
标签: ASP
        为了能使我们做出来的留言簿更美观,让我们来给上一章的简单留言簿润下色,再令其留言在另外的一个单独的页面显示。 那么怎样给该留言簿润色呢?留言表单界面的背景总不能没吧?而且为了让留言表单的内容显示得更加规整,我们是否有必要用框架将留言表单的内容框起来呢?想好了,现在就让我们立即动...

经验教程

137

收藏

98
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部