C程序排序日期

  • 本文关键字:日期 排序 程序 c
  • 更新时间 :
  • 英文 :


我正在执行C程序,以对用户使用内置QSort函数按时间顺序输入的日期进行分类。我正在使用结构。但是,我的代码无法正确排序它们。有帮助吗?这是我在Qsort中调用的代码。

int comparator(const void *p, const void *q) 
{
    int l3 = ((struct dates *)p)->year;
    int r3 = ((struct dates *)q)->year; 
    if(l3 >= 90 || l3<=99 ){
        if(l3 > r3){
            return 1;   
        }
        else if(l3 < r3){
            return -1;
        }
    }
    else if(l3 > 99){         
        if(l3 > r3){
            return 1;   
        }
        else if(l3 < r3){
            return -1;
        }            
    }   
    int l2 = stringtoInt(((struct dates *)p)->month);
    int r2 = stringtoInt(((struct dates *)q)->month); 
    if (l2 > r2)
    {
        return 1;
    }
    else if ( l2 < r2)
    {
        return -1;
    }
    int l = ((struct dates *)p)->day;
    int r = ((struct dates *)q)->day; 
    if (l > r)
    {
        return 1;
    }
    else if ( l < r)
    {
        return -1;
    }          
}

您的第一个(如果构造),

if (l3 >= 90 || l3 <= 99)

将始终评估为true,因此将永远不会输入以下else if。我假设该条件是l3 >= 90 && l3 <= 99,尽管如果是这样的话,由于以下else if具有相同的身体,您可以将它们合并到单个IF语句中,if (l3 >= 90)

此外,您没有处理l3 < 90的情况,因此,在这种情况下,您的比较器将忽略年份,然后继续按月和一天进行比较。

我还将在函数末尾添加一个明确的return 0,当确定日期相等时。

已发布的代码似乎假设年度字段仅为2位数字。这是一个有效的假设?

这一行:

else if(l3 > 99){

是不正确的,因为2位年份的"应该"不应该超过99。

i 建议使用4位数年,但这是您的数据设计选择)

但是,如果一年不在90 ... 99(包含)范围内,那么它必须在新世纪

因此,无需检查一年是否> 99,只需假设它是在新世纪。

当一个日期是上一个世纪(90 ... 99)而另一个日期是下一个世纪时会发生什么?该代码似乎没有考虑到这种情况。

我正在研究计划制造程序程序,所以这是我用来对日期进行排序的代码

void LinkedList::appendNode(Node* newNode){
    Node *ptr = head;
    if (head == NULL){
        head = newNode;
    }else{
        //First compare years if newNode year is less than 1st node if yes, interchange them
        if(ptr->year > newNode->year){
            newNode->link = head;
            head = newNode;
        }
        //if years are same then compare months
        else if(ptr->year == newNode->year){
            //compare if newNode month is less than the 1st node in list if yes, interchange them
            if(ptr->month > newNode->month){
                newNode->link = head;
                head = newNode;
            }
            //if months of both are equal compare dates
            else if(ptr->month == newNode->month){
                //compare if date of newNode is smaller than the 1st node. If yes, interchange them
                if(ptr->date > newNode->date){
                    newNode->link = head;
                    head = newNode;
                }
                //if dates are same then, check time
                else if(ptr->date == newNode->date){
                    //compare the hour
                    if(ptr->hour > newNode->hour){
                        newNode->link = head;
                        head = newNode;
                    }
                    //if hour is same check time
                    else if(ptr->hour == newNode->hour){
                        //compare the minute
                        if(ptr->min > newNode->min){
                            newNode->link = head;
                            head = newNode;
                        }
                        else if(ptr->min == newNode->min){
                            newNode->link = head;
                            head = newNode;
                        }
                        //if minute in newNode is greater then traverse and place it accordingly
                        else{
                            ptr = head;
                            //traverse the link till the next node is greater than the newNode
                            while(ptr->link != NULL){
                                if(ptr->link->year > newNode->year)
                                    break;
                                else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month)
                                    break;
                                else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month && ptr->link->date > newNode->date)
                                    break;
                                else if(ptr->link->year==newNode->year&&ptr->link->month>newNode->month&&ptr->link->date==newNode->date&&ptr->link->hour>newNode->hour)
                                    break;
                                else if(ptr->link->year==newNode->year&&ptr->link->month>newNode->month&&ptr->link->date==newNode->date&&ptr->link->hour==newNode->hour&&ptr->link->min>newNode->min)
                                    break;
                                ptr = ptr->link;
                            }
                            newNode->link = ptr->link;
                            ptr->link = newNode;
                        }
                    }
                    //if hour in newNode is greater then traverse and place it accordingly
                    else{
                        ptr = head;
                        //traverse the link till the next node is greater than the newNode
                        while(ptr->link != NULL){
                            if(ptr->link->year > newNode->year)
                                break;
                            else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month)
                                break;
                            else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month && ptr->link->date > newNode->date)
                                break;
                            else if(ptr->link->year==newNode->year&&ptr->link->month>newNode->month&&ptr->link->date==newNode->date&&ptr->link->hour>newNode->hour)
                                break;
                            else if(ptr->link->year==newNode->year&&ptr->link->month>newNode->month&&ptr->link->date==newNode->date&&ptr->link->hour==newNode->hour&&ptr->link->min>newNode->min)
                                break;
                            ptr = ptr->link;
                        }
                        newNode->link = ptr->link;
                        ptr->link = newNode;
                    }
                }
                //else if newNode date is greater
                else{
                    ptr = head;
                    //traverse the link till the next node is greater than the newNode
                    while(ptr->link != NULL){
                        if(ptr->link->year > newNode->year)
                            break;
                        else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month)
                            break;
                        else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month && ptr->link->date > newNode->date)
                            break;
                        ptr = ptr->link;
                    }
                    newNode->link = ptr->link;
                    ptr->link = newNode;
                }
            }
            //else if the month of newNode is greater
            else{
                ptr = head;
                //traverse the link till the next node is greater than the newNode
                while(ptr->link != NULL){
                    if(ptr->link->year > newNode->year)
                        break;
                    else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month)
                        break;
                    else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month && ptr->link->date > newNode->date)
                        break;
                    ptr = ptr->link;
                }
                newNode->link = ptr->link;
                ptr->link = newNode;
            }
        }
        //else if the year of year of newNode is greater
        else{
            ptr = head;
            //traverse the link till the next node is greater than the newNode
            while(ptr->link != NULL){
                if(ptr->link->year > newNode->year)
                    break;
                else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month)
                    break;
                else if(ptr->link->year == newNode->year && ptr->link->month > newNode->month && ptr->link->date > newNode->date)
                    break;
                ptr = ptr->link;
            }
            newNode->link = ptr->link;
            ptr->link = newNode;
        }
    }
}

最新更新