【问题标题】:Bubble sort for linked list链表的冒泡排序
【发布时间】:2012-09-29 08:53:25
【问题描述】:

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

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

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

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

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

如果有人能帮我解释一下,那就太好了!

【问题讨论】:

  • 我假设 countComp 比较字符数,wordComp 比较单词,lineComp 比较行,对吧?只需定义您的 swap 函数,选择您要比较的内容,然后将其命名为 sort(my_head, &swap, &_ANY_Comp)
  • comparePtr 的参数是不透明的,所以假设是:函数实现理解传入的内容以及如何将其转换为有意义的类型。 sort 作为调用者也需要知道这一点。

标签: c list sorting linked-list


【解决方案1】:

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++ 函数运行良好。

【讨论】:

    【解决方案2】:

    在我看来,创建此标头的人希望 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

    【讨论】:

    • 三种情况不用处理。如果ab 是有序的,则不要理会它们,否则交换。
    • 好吧..我对 lnode* alnode* b 的来源感到困惑。
    • Matt, a 和 b 指向您想要考虑交换的任何两个节点。你知道冒泡排序算法是如何工作的吗?该算法告诉您要考虑交换哪些节点。在第一次迭代中,您可能会执行 a = *headb = a-&gt;next 以便 a 和 b 指向列表中的前两个节点。
    【解决方案3】:

    如果你有两个功能:

    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,它们将被隐式取消引用。

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多