Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中双参数链表排序_C - Fatal编程技术网

C语言中双参数链表排序

C语言中双参数链表排序,c,C,链表包含两种类型的数据-整数计数和浮点秩。列表需要先根据计数,然后根据排名按降序排序。我已经根据计数对列表进行了排序,但似乎我没有完全了解这个过程 我知道如果当前计数等于下一个计数,则比较秩并插入具有更高秩的节点 我在注释后更改了代码,但是它确实正确地输出了数据(不按排名排序)。我怎样才能修好它 按第一个参数排序的列表(我当前得到的): 按第二个参数对列表排序后的预期输出: 2, 0.157685 2, 0.152009 2, 0.092575 2, 0.077676 1, 0.262355 1

链表包含两种类型的数据-整数计数和浮点秩。列表需要先根据计数,然后根据排名按降序排序。我已经根据计数对列表进行了排序,但似乎我没有完全了解这个过程

我知道如果当前计数等于下一个计数,则比较秩并插入具有更高秩的节点

我在注释后更改了代码,但是它确实正确地输出了数据(不按排名排序)。我怎样才能修好它

按第一个参数排序的列表(我当前得到的):

按第二个参数对列表排序后的预期输出:

2, 0.157685
2, 0.152009
2, 0.092575
2, 0.077676
1, 0.262355
1, 0.184311
1, 0.073388
我的代码:

typedef struct node {
    int count;
    float rank;
    struct node *next;
} NodeT; 

void insertionSort(NodeT **head) {
    
    NodeT *sorted = NULL;
    NodeT *current = *head;
    while (current != NULL) {
        NodeT *next = current->next;
        sortedInsert(&sorted, current);
        current = next;
    }
    *head = sorted;
}

void sortedInsert(NodeT **head, NodeT *new) {

    NodeT *current;

    if (*head == NULL || (*head)->count <= new->count) {
        new->next = *head;
        *head = new;

    } else {
        current = *head;
        while (current->next != NULL) {

            /* Should second parameter check go here? */

            if (current->next->count > new->count) {
                current = current->next;

            } else if (current->next->count == new->count) {

                while (current->next != NULL && current->next->rank > new->rank) {
                    current = current->next;
                } 
            }

        }
        new->next = current->next;
        current->next = new;
    }
}
typedef结构节点{
整数计数;
浮动秩;
结构节点*下一步;
}节点;
void insertionSort(节点**头){
NodeT*sorted=NULL;
节点*电流=*头;
while(当前!=NULL){
节点*下一步=当前->下一步;
分拣机(&分拣,当前);
当前=下一个;
}
*头=已排序;
}
空分拣机(节点**头部,节点*新){
节点*电流;
如果(*head==NULL | |(*head)->计数){
新建->下一步=*头部;
*头=新的;
}否则{
电流=*水头;
while(当前->下一步!=NULL){
/*第二个参数检查应该在这里进行吗*/
如果(当前->下一步->计数->新建->计数){
当前=当前->下一步;
}否则如果(当前->下一步->计数==新->计数){
while(当前->下一步!=NULL&¤t->下一步->排名>新建->排名){
当前=当前->下一步;
} 
}
}
新建->下一步=当前->下一步;
当前->下一步=新建;
}
}
中是一个使用
qsort
和定义的比较函数(
cmp()
)的示例。它以struct的形式实现节点,在
main()
中创建列表

插入排序的一个示例是在中使用带有定义的比较函数(
cmp()
)的
qsort
)。它以struct的形式实现节点,在
main()
中创建列表

插入排序的一个例子是在

中,“正确”的方法可能是编写一个比较函数,以避免两个嵌套的
while
循环

int compare_nodes(NodeT *n1, NodeT *n2)
{
    if (n1->count < n2->count)
        return -1;
    if (n1->count > n2->count)
        return 1;
    if (n1->rank < n2->rank)
        return -1;
    if (n1->rank > n2->rank)
        return 1;
    return 0;
}
int比较_节点(节点集*n1,节点集*n2)
{
如果(n1->计数计数)
返回-1;
如果(n1->计数>n2->计数)
返回1;
如果(n1->rankrank)
返回-1;
如果(n1->rank>n2->rank)
返回1;
返回0;
}
现在,您应该可以更轻松地实现插入函数了。

正确的方法可能是编写一个比较函数,以避免两个嵌套的
while
循环

int compare_nodes(NodeT *n1, NodeT *n2)
{
    if (n1->count < n2->count)
        return -1;
    if (n1->count > n2->count)
        return 1;
    if (n1->rank < n2->rank)
        return -1;
    if (n1->rank > n2->rank)
        return 1;
    return 0;
}
int比较_节点(节点集*n1,节点集*n2)
{
如果(n1->计数计数)
返回-1;
如果(n1->计数>n2->计数)
返回1;
如果(n1->rankrank)
返回-1;
如果(n1->rank>n2->rank)
返回1;
返回0;
}

现在,您应该可以更轻松地实现插入函数。

什么是“它不工作”呢?你试过调试你的代码吗?通过在调试器中单步执行并检查变量,您将了解更多信息。请发表一篇文章。@jwdonahue我已经描述了预期输出和当前输出样本的问题,并说明我无法用当前代码按第二个参数排序,并询问如何解决它。你还需要什么其他的细节?阅读,你能用英语写出你想要的算法吗?我发现在写算法之前先描述它会有帮助,“它不工作”到底是什么意思?你试过调试你的代码吗?通过在调试器中单步执行并检查变量,您将了解更多信息。请发表一篇文章。@jwdonahue我已经描述了预期输出和当前输出样本的问题,并说明我无法用当前代码按第二个参数排序,并询问如何解决它。你还需要什么其他的细节?阅读,你能用英语写出你想要的算法吗?我发现在写算法之前先描述算法会有所帮助。考虑到这似乎是OP的家庭作业,而且他们似乎在尝试编写插入排序算法,所以可以安全地假设qsort不是一个可接受的答案。是的,我编辑了这篇文章,因为这似乎是OP的家庭作业,他们似乎正在尝试编写一个插入排序算法,假设qsort不是一个可接受的答案可能是安全的。是的,我编辑了这个