2013-09-25 69 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您可以輕鬆地對它們進行比較和排序相應。