我正在执行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;
}
}
}