首页 文章

C程序排序日期

提问于
浏览
0

我正在做一个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;
    }          
}

3 回答

  • 0

    发布的代码似乎假设年份字段只有2位数 . 这是一个有效的假设吗?

    这一行:

    else if(l3 > 99){
    

    是不正确的,因为2位数'应该'永远不会超过99 .

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

    然而,似乎如果年份不在90-99的范围内,那么它必须在新世纪

    所以不需要检查年份是否> 99,只是假设它是在新世纪 .

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

  • 3

    你的第一个if构造,

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

    将始终评估为true,因此永远不会输入以下 else if . 我假设条件是 l3 >= 90 && l3 <= 99 ,虽然如果是这种情况,因为以下 else if 具有相同的主体,您可以将它们合并为单个if语句 if (l3 >= 90) .

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

    当确定日期相等时,我还会在函数末尾添加一个显式 return 0 .

  • 0

    I was working on a schedule maker program so here's the code i have used to sort dates

    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;
            }
        }
    }
    

相关问题