当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

留言簿程序的编写

    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("\n\n\nDate:%4d %2d %2d",p->t_date.da_year,p->t_date.da_mon,p->t_date.da_day);
        printf("\nTime: %2d: %2d: %2d",p->t_time.ti_hour,p->t_time.ti_min,p->t_time.ti_sec);
        printf("\n\n\tPlease 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)

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接