2013-09-25 29 views
0

在结构上我有我需要的升序排列的结构:排序根据日期和时间元素

typedef struct CallLogSearchDataStruct 
{ 
    char * date; 
    char * time; 
    char * bParty; 
    char * aParty; 
    float duration; 
    char * cleardownCause; 
    struct CallLogSearchOutboundStruct * outboundLegs; 
    int maxDataCol; 
} callLogSearchDataStruct; 

我需要梳理基础上按升序排列的日期和时间结构。日期和时间是按以下格式

日期:16/05/2011时间:01:20:03

我需要按升序排列上述两个字段进行排序,我一直在寻找快速排序,但我想不出一种能够做到的方式。我以下面的方式调用函数。

qsort(callLogSearchData, dataRow, sizeof(callLogSearchDataStruct), sortCompare); 

我的功能如下

int sortCompare(const void * a, const void * b) 
{ 
    const callLogSearchDataStruct *u1 = a; 
    const callLogSearchDataStruct *u2 = b; 

    if (u1->date < u2->date) 
    { 
     return -1; 
    } 
    else if (u1->date > u2->date) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 

} 

当我做上面的代码,它似乎并没有螺丝结构,即布局时我出口排序,并改了结构的内容到文件中,所有内容都按照错误的列顺序出现,但没有问题,除非比较没有完成时排序顺序错误。

+0

任何你不以[unix时间戳格式](http://en.wikipedia.org/wiki/Unix_time)存储你的日期和时间的原因?您将节省内存,您的比较功能将很简单。 – Michael

+0

现在,您不会比较日期,而是指向日期的指针。 – Matthias

+0

@Michael这主要是由于这是格式日期是需要导出到文件 – Boardy

回答

5

你在比较指针,这当然不是你正在寻找的。这里有一个方法来比较结构:

  • 解析字符串并提取像今年各个组件,月日等
  • 装满所需的细节struct tm,并呼吁它
  • mktime此时你已经有2个time_t值,你可以比较使用difftime

这听起来像一个大量的工作,这是!如果你愿意去一些不便携的地方,你可以尝试一下美妙的strptime,它把字符串转换成struct tm

+0

我还会主张使用'yyyy/mm/dd'日期格式来代替'dd/mm/yyyy',在这种情况下'strcmp(a-> date,b-> date)'可能就足够了。 – nos

+0

@nos是的,我正在考虑提及'strcmp',但后来注意到格式不适用于此。事实上,使用你提到的格式,甚至把字符串转换成这种格式,然后调用'strcmp'确实是一个明智的方法。谢谢你的评论 :-) – cnicutar

0

看来你正在比较字符指针和基于你正在作出决定。但是你必须比较日期和时间值进行排序。 因为它们都是字符串,所以你应该解析字符串,在不同的变量中获得年份,月份,日期,小时,秒。 现在你可以使用

mktime()

这将返回它的time_t format.Now您可以轻松地对它们进行比较和排序相应。