我正在为链表制作冒泡排序功能。这是函数的标题:
void sort(struct lnode** head,
void (*swapPtr)(struct lnode** head, struct lnode* n1, struct lnode* n2),
int (*comparePtr)(void* v1, void* v2))
我真的不了解正在使用的函数指针。 swapPtr
是指向函数的函数指针,该函数用于交换列表中的两个节点。 comparePtr
用作指向三个函数之一的指针,所有这些函数都比较结构的某个成员中的值,该成员用于存储给定单词的计数和行号。可能性是:
countComp
- 取两个节点并比较单词显示的次数,如果相等则返回0,如果node1> 1则返回1节点2和-1反向。
wordComp
- 比较给定节点的单词与上述相同的返回值。
lineComp
- 比较上述相同返回值的单词行号。
我理解冒泡排序的工作原理以及实现排序列表的一般步骤。我困惑的地方是如何调用comparePtr
以及我需要传递给它的是什么?我还有一个test.c
文件用于测试我的排序方法。我该如何调用sort函数?我不知道第二和第三个论点要传递什么。
如果有人可以帮我向我解释,那就太好了!
答案 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的定义中,您可以像调用任何其他函数一样调用swapPtr
和comparePtr
,它们将被隐式取消引用。
答案 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
}
答案 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 ++函数工作正常。