首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个超时删除节点的程序,该如何处理

2012-03-04 
一个超时删除节点的程序本来一个很容易的子函数,但是我怎么写都是段错误,大家帮我看看这个有什么错误!程序

一个超时删除节点的程序
本来一个很容易的子函数,但是我怎么写都是段错误,大家帮我看看这个有什么错误!
程序目的:在主函数中设定alarm(5),signalset捕捉alarm信号,捕捉到就调用下面的子程序,遍历整个链表,将节点中的时间和当前时间比较,时间差超过5秒就把这节点删掉,链表中可能不止一个节点超时,要把每一个超时的都删掉,下面是代码

C/C++ code
void comp_time(struct ip_info *head){        struct ip_info *tmp;        struct ip_info *tmp2;        long int s;        /*再次设定时间*/        alarmset();        printf("\nalarm 再次设定\n");            /*取得当前的时间         * gettimeofday函数可以给timeval的结构体赋值         */        gettimeofday(&now,NULL);        printf("2222222222");        if(head == NULL)        {                   printf("list is NULL!\n");                exit(0);        }           tmp = head; //head为链表的头        tmp2 = head;        printf("11111111111111111");        /*使用do,while语句循环完所有的节点*/        do        {       s = (now.tv_sec - tmp->get_time.tv_sec)*1000000 + (now.tv_usec - tmp->get_time.tv_usec);                /*如果当前的节点不符合条件就continue*/                while(s < over_time)                {                    tmp2 = tmp;                    tmp = tmp->next;                    s = (now.tv_sec - tmp->get_time.tv_sec)*1000000 + (now.tv_usec - tmp->get_time.tv_usec);                    continue; //不知道这个该不该加                }                if(tmp == head)                {                    head = tmp->next;                    tmp2 = tmp;                    tmp = tmp->next;                    free(tmp2);                }                else                {                    tmp2 = tmp;                    tmp = tmp->next;                    free(tmp2);                }        }while(tmp != NULL);}

我真不知道哪儿出错了!
或者大侠帮我想个好点思路,不知道我的思路对不!

[解决办法]
探讨
C/C++ code

while(s < over_time &amp;&amp; tmp != NULL)//这个要改下
{
tmp2 = tmp;
tmp = tmp->next;
s = (now……

[解决办法]
C/C++ code
                else if( tmp == NULL)//还要加个判断语句                {                    break;                 }                 else                {                    tmp2 = tmp;                    tmp = tmp->next;                    free(tmp2);                }
[解决办法]
探讨
这样写的话就只能查到一个超时的节点 不是多个!我要把多个都改了

[解决办法]
C/C++ code
void comp_time(struct ip_info *head){    struct ip_info *tmp;    struct ip_info *pre;    long int s;    /* TODO : 记录当前时间 */    long int now;    /*再次设定时间*/    alarmset();    printf("\nalarm 再次设定\n");    /*取得当前的时间     * gettimeofday函数可以给timeval的结构体赋值     */    gettimeofday(&now,NULL);        tmp = head; //head为链表的头    pre = head;//pre    /* TODO : 获取当前时间 你愿意也可以放循环里面....*/    now = now.tv_sec*1000000 + now.tv_usec;    while ( tmp != NULL ) {        s = tmp->get_time.tv_sec*1000000 + tmp->get_time.tv_usec;        if ( (now - s) >= over_time) {            /* TODO : 这里就是所有超时的节点 */            if (tmp == pre) {                head = head->next;                free(tmp);                tmp = head;                 pre = head;                    } else {                pre->next = tmp->next;                free(tmp);                tmp = pre->next;            }            continue;        }         pre = tmp;        tmp = tmp->next;    }}
------解决方案--------------------


不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
whlie (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。

热点排行