链表的冒泡排序

时间:2012-10-09 04:54:20

标签: c list sorting linked-list

我正在为链表制作冒泡排序功能。这是函数的标题:

void sort(struct lnode** head,
          void (*swapPtr)(struct lnode** head, struct lnode* n1, struct lnode* n2),
          int (*comparePtr)(void* v1, void* v2))

我真的不了解正在使用的函数指针。 swapPtr是指向函数的函数指针,该函数用于交换列表中的两个节点。 comparePtr用作指向三个函数之一的指针,所有这些函数都比较结构的某个成员中的值,该成员用于存储给定单词的计数和行号。可能性是:

  1. countComp - 取两个节点并比较单词显示的次数,如果相等则返回0,如果node1> 1则返回1节点2和-1反向。

  2. wordComp - 比较给定节点的单词与上述相同的返回值。

  3. lineComp - 比较上述相同返回值的单词行号。

  4. 我理解冒泡排序的工作原理以及实现排序列表的一般步骤。我困惑的地方是如何调用comparePtr以及我需要传递给它的是什么?我还有一个test.c文件用于测试我的排序方法。我该如何调用sort函数?我不知道第二和第三个论点要传递什么。

    如果有人可以帮我向我解释,那就太好了!

3 个答案:

答案 0 :(得分:0)

如果您有两个功能:

void intSwapPtr(struct lnode** head, struct lnode* n1, struct lnode* n2) {
    //definition
}

int intComparePtr(void* v1, void* v2) {
    //definition
}

然后你可以通过将这些函数作为参数传递来调用sort。当用作参数时,这些函数将被隐式转换为指向函数的指针。

swap(listHead, intSwapPtr, comparePtr)

在swap的定义中,您可以像调用任何其他函数一样调用swapPtrcomparePtr,它们将被隐式取消引用。

答案 1 :(得分:0)

在我看来,无论是谁创建了这个头,都希望comparePtr获取两个指针并返回一个int,告诉你哪个节点在节点的排序中“更大”。

所以你会这样称呼它:

lnode * a = ...;
lnode * b = ...;
int comparison = comparePtr(a, b);
if (comparison < 0)
{
    // we know a comes after b
}
else if (comparison > 0)
{
    // we know a comes after b
}
else
{
    // a and b are equal as far as ordering is concerned
}

这就像ruby spaceship operator

答案 2 :(得分:0)

void sortList(node *start) { head = start;

for(ptr = head; ptr != NULL; ptr = ptr->next)
{
    for(newptr = ptr->next; newptr != NULL; newptr = newptr->next)
    {
        if(ptr->data > newptr->data)
        {
            int temp = ptr->data;
            ptr->data = newptr->data;
            newptr->data = temp;
        }
    }
}

for(ptr = head; ptr != NULL; ptr = ptr->next) { for(newptr = ptr->next; newptr != NULL; newptr = newptr->next) { if(ptr->data > newptr->data) { int temp = ptr->data; ptr->data = newptr->data; newptr->data = temp; } } }

这个用于对给定链接列表进行排序的C ++函数工作正常。