0

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

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 > node 2 则返回 1,反之则返回 -1。

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

  3. lineComp— 比较单词出现在与上述相同的返回值上的行号。

我了解冒泡排序的工作原理以及实现排序列表的一般步骤。我感到困惑的领域是如何打电话comparePtr以及我需要传递什么?我还有一个test.c用于测试我的排序方法的文件。我将如何调用排序函数?我不确定第二个和第三个参数应该传递什么。

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

4

3 回答 3

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

}

这个用于对给定链接列表进行排序的 C++ 函数运行良好。

于 2013-07-29T18:03:14.933 回答
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 的定义中,您可以调用swapPtrandcomparePtr以与调用任何其他函数相同的方式,它们将被隐式取消引用。

于 2012-10-09T05:01:17.033 回答
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
}

这就像红宝石飞船操作员

于 2012-10-09T05:02:05.990 回答