我将函数 bubble_sort_linkedList 声明为
void bubble_sort_linkedList(node *head);
函数的定义(按升序排序)如下:
void bubble_sort_linkedList(node *head){
node *ptr, *lptr;
int temp;
lptr = NULL; ptr = head;
if(ptr == NULL || ptr->next == NULL)
return;
while(ptr != lptr){
while(ptr->next != lptr){
if(ptr->next->value < ptr->value){ // Change the inequality sign
temp = ptr->next->value;
ptr->next->value = ptr->value;
ptr->value = temp;
}
ptr = ptr->next;
}
lptr = ptr;
ptr = head;
}
return;
}
现在,我希望同样的功能也可以按降序排序,只需在注释行中更改一个符号。
所以,我打算做的改变是:
void bubble_sort_linkedList(node *head, bool is_ascending); //Prototype declaration
is_ascending 是从主函数传递的决定。
相同的函数,但三元运算符用作占位符(这是我困惑的部分,可以使用三元运算符,如下所示?)
void bubble_sort_linkedList(node *head, bool is_ascending){
node *ptr, *lptr;
int temp;
lptr = NULL; ptr = head;
if(ptr == NULL || ptr->next == NULL)
return;
while(ptr != lptr){
while(ptr->next != lptr){
if(ptr->next->value ((is_ascending) ? <:>) ptr->value){
temp = ptr->next->value;
ptr->next->value = ptr->value;
ptr->value = temp;
}
ptr = ptr->next;
}
lptr = ptr;
ptr = head;
}
return;
}
答案 0 :(得分:2)
如果你已经尝试过,你会发现你不能这样做。冒号之前和之后的东西必须是一个有效的表达式,它只是一个没有任何东西的二元运算符。
您可以使用三元运算符,但更详细。
bool less = (is_ascending)
? (ptr->next->value < ptr->value)
: (ptr->next->value > ptr->value);
if (less) ...
另一种可能性是传递比较函数(如qsort
所做)而不是布尔标志来确定如何比较节点。这是多功能的,但如果您只是想区分升序和降序,可能会有点开销。
(此外,:>
和<:
的方括号为digraphs,因此您的代码实际上并不是乍一看的样子。)
答案 1 :(得分:1)
你不能这样做。但是你可以编写一个表达式来进行条件比较:
if (is_ascending ? ptr->next->value < ptr->value : ptr->next->value > ptr->value) ...
如果保证is_ascending
为0
或1
,则可以选择单个测试更快的替代方法:
if ((ptr->next->value < ptr->value) == is_ascending) ...
相同的元素将以不同的方式排序,但排序仍然是正确的。
答案 2 :(得分:0)
您不能像这样更改比较运算符,而是可以更改比较本身。
如果你真的想做一个单行,你可以这样做:
<div class="...">
<?php
// Set counter
$i = 1;
// Loop over your posts
while (have_posts()) {
// If you have ouputted three already then close and reopen div
if ($i == 3) {
$i = 1;
echo '</div><div class="...">';
}
// Output the post and increment the counter
the_content();
$i++;
}
?>
</div>