【问题标题】:Bubble Sort in a structed list that are filled by a csv file由 csv 文件填充的结构化列表中的冒泡排序
【发布时间】:2011-11-29 23:54:55
【问题描述】:

我加载了一个 .csv 文件来填充我的结构

typedef struct list TList;
    struct list {
        int index;
        char data;
        TList* prox;
    };

如何在我的列表中进行冒泡排序?

我试过了

void bubble(TList *list, int siz) {
    int c = 0;
    int x, y, temp;

    for (x = (siz - 1); x >= 0; x--) {
        c++;
        for (y = 1; y <= x; y++) {
            c++;
            if (list->index[y - 1] > list->index[y]) {
                temp = list->index[y - 1];
                list->index[y - 1] = list->index[y];
                list->index[y] = temp;
            }
        }
    }
    printf("\nNeeded Steps: %i\n", c);
}

我认为这是因为list-&gt;index[y]。它就像数据库中的一个表......在位置 0(索引),我有数据和指向下一个节点的指针。使用list-&gt;index[..],我想传递位置并获取该节点,就像一个数组一样。它是一个链表,prox 需要指向下一个节点。我用来自 .csv 文件的数据填充了我的列表,list-&gt;prox 指向下一个节点。

【问题讨论】:

  • list-&gt;index[...] 毫无意义。 indexint,而不是数组。你想在这里做什么?
  • index 被声明为int 时,index[y - 1] 是什么意思?
  • 不...我认为这是因为 list->index[y].
  • 发生了什么?你期望会发生什么?这是一个自制的链表吗?这是 C++ 还是 C(在我看来像 C)?请在问题中提供尽可能多的信息。
  • 它就像数据库中的一个表......在位置 0(索引),我有数据,以及指向下一个寄存器的指针

标签: c++ linked-list bubble-sort


【解决方案1】:

STL 提供了很好的内置排序算法。检查http://www.cplusplus.com/reference/algorithm/

【讨论】:

  • 是的,这是 C++ 标准库的一部分
  • 好的,但是我该怎么做才能传递一个列表?
  • 如果您想要对文件中的数字进行排序。解析出数字并将它们存储在一个向量中,在这个向量上调用 STL 排序。我想你可以得到你想要的。
【解决方案2】:
typedef struct list TList;
struct list {
    int index;
    char data;
    TList* prox;

    //give the list an [] like an array
    char& operator[](int index) {
        TList* cur = this;
        while(cur->index != index) {
            if (cur->prox == NULL)
                throw std::exception("INVALID INDEX");
            cur = cur->prox;
        }
        return cur->data;
    }
};

这将让您在链表上使用索引运算符,有点像数组。

        if ((*list)[y - 1] > (*list)[y]) {

【讨论】:

  • 我必须做哪些事情来实现它?
【解决方案3】:

您的内部 if 不正确(if 条件和交换)。 您想要交换整个 TList,而不仅仅是每个 TList 的索引。例如,如果您有两个这样的 TList:

TList[0]       TList[1]
Index1         Index0
"Data for 1"   "Data for 0"  

交换后,你想要

TList[0]       TList[1]
Index0         Index1
"Data for 0"   "Data for 1"

相反,您的内部循环会这样做:

TList[0]       TList[1]
Index0         Index1
"Data for 1"   "Data for 0"

但它实际上并没有这样做,因为你的 if 条件不像 Mooing Duck 在 cmets 中指出的那样工作。提示:您不想更改任何 TList 中的任何内容,您只想更改它们相对于彼此的位置。

【讨论】:

    【解决方案4】:

    为什么要使用冒泡排序?这是一个本质上总是错误选择的算法的经典示例!

    如果您在实际代码中执行此操作,只需使用标准集合(std::list 如果您坚持使用链表,可能是 std::vector 如果您理智的话),然后使用std::sort 来做排序。

    如果您这样做是为了做家庭作业,并且确实必须使用自己的列表结构和可怕的算法,那么您将使用指针而不是下标来实现迭代和比较,因此您的比较将类似于

    if (pos->index > pos->next->index)
        /* swap items */
    

    您(可能)还希望至少将您的内部循环基于指针操作而不是整数和索引——它的增量操作可能类似于pos=pos-&gt;next

    还要注意,对于单链表,很难进行涉及当前节点的交换,因此您经常需要考虑下一个节点和之后的节点(至少在您可以时——即,不处理第一个节点)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2012-09-29
      相关资源
      最近更新 更多