如何在结构中对数据进行排序

时间:2013-11-07 21:30:36

标签: c sorting structure

我需要首先以最低成本打印并排序avgCost整数。

我怎样才能通过各种方式实现这一目标?

我只需要帮助对avgCost整数进行排序,以便以最低的成本打印出来。不需要特定的排序例程。我可以通过已经集成的qsort()来完成这个吗?

#include <stdio.h>
#include <cstdlib>

int main(void)
{
  struct mcDonalds {
      char   *name;
      char    *address;
  int   avgCost;
  char  foodType;
};

struct  burgerKing {
      char   *name;
      char   *address;
  int   avgCost;
  char  foodType;
};

struct tacoBell {
  char   *name;
      char   *address;
  int   avgCost;
  char  foodType;
};

struct mcDonalds     a;
struct burgerKing    b;
struct tacoBell  c;


printf("\n\n");
system("PAUSE");
return 0;
}

2 个答案:

答案 0 :(得分:2)

编辑:显然你可以使用qSort,但在你做任何其他事情之前你应该真的读过这个。并阅读有关如何使用结构以及链接列表的信息

方法1

我还相信你应该将你的结构设置为一个链表,它将在添加元素时进行排序。没有必要为每个食品供应商提供单独的结构。相反,你可以拥有这样的东西:

struct fastFoodVendor{
  char *chain;
  char *name;
  char *address;
  char *foodType;
  int avgCosts;
  struct fastFoodVendor *next
}

现在,当您添加一个结构时,将其合并到链接列表中,并在添加项目时进行排序。

假设您的列表中已经有3个结构,其平均价格如下:

5-10-15

所以avg价格为5的第一个结构有一个名为next的指针,指向avg价格为10的结构,而这个指针又有一个名为next的指针,结构的平均价格为15。

现在您想要将平均价格为13的链添加到此列表中,您需要使用某种类型的添加方法,其工作原理如下:

请记住,您必须首先拥有一些变量...一个是fastFoodVendor结构,称为头部指向列表中的第一个元素(5)(struct fastFoodVendor *head)您将设置当添加第一个元素时,然后根据列表需要更新它。

因此,我会建议另一个名为temp的结构指针,它将遍历列表,直到找到正确的位置。为此我会有一个while循环。

while(temp->next != null){
  if(temp->next->avgCost > structToAdd->avgCost){
    structToAdd->next = temp->next;
    temp->next = structToAdd;
  }
  else{
    temp = temp->next;
  }
}

这样做是在15之前的列表中插入13。

让我解释这个while循环的作用......你必须将条件集设置为temp->next != null,因为如果你尝试从空指针访问信息,你将得到一个segFault。

进入循环后,您将检查前面的节点是否具有比您尝试插入的节点更高的avgCost。所以temp指向5,你检查下一个节点的avgCost是否大于13,但它是10,所以你通过设置temp = 10的节点在列表中前进。现在你在10你检查下一个节点(15)是否大于13 ......它是......所以你仍然是10,你想要在你要添加的结构旁边设置这个节点,但在你之前你必须设置你想要添加的节点(13)的下一个指向temp->next当前指向的指针,否则你将丢失该节点,因为一旦你设置了10个下一个节点就没有任何指向它的节点指向13节点的指针。

我知道这真的很长,可能很复杂,所以这是一种方法,我个人不会使用,但它应该工作

方法2

你有一个固定的结构数组,但这只有你使用一种类型的结构(即我上面列出的fastFoodVendor)并且有一个固定的数组,你可以像平常一样排序数组,但我仍然不相信你能够使用qSort,所以你必须开发自己的方法来排序和更改数组中的东西。我不会选择这种方法的原因是因为存在大量开销,并且浪费了大量时间(取决于您处理的数据量,对于您的情况,我假设差异可以忽略不计)。关于C的最好的事情之一是它如何具有动态性,这就是链表正在做的事情。

看一下这个链表教程: http://www.cprogramming.com/tutorial/c/lesson15.html应该有希望帮助

答案 1 :(得分:0)

也许您可以尝试下面的示例,然后在avgCost上使用冒泡排序(您可以找到性能更好的分拣机,但这只是为了说明)。

我喜欢链表的想法,即实现为优先级队列,但下面的代码为您提供了另一个考虑的例子。请注意,我将数据设置为指向结构数组的指针,而不是每个食品供应商的单独结构(metsales和jpw的评论也提到)。

另外,您不想要成本的浮点变量吗?我继续这样设置它。

希望这有用。


#include <stdio.h>
#include <stdlib.h>

struct restaurant {
    char *name;
    char *address;
    float avgCost;
    char foodType;
};

int main(void)
{
    int n = 3;
    float cost[] = {2.32, 3.56, 1.89};
    struct restaurant* fastfood = malloc(sizeof(struct restaurant)*n);

    for (int i = 0; i < n; i++) {
        //fastfood[i].name = // you can add names and other data as you see fit
        fastfood[i].avgCost = cost[i];
    }

    // Bubble sort here; not a great performer, O(n^2), but maybe ok for your app.
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j < n-i-1; j++) {
            if(fastfood[j].avgCost > fastfood[j+1].avgCost) {
                struct restaurant temp = fastfood[j];
                fastfood[j] = fastfood[j+1];
                fastfood[j+1] = temp;
            }
        }
    }

    for (int i = 0; i < n; i++)
        printf("Avg cost = %f \n",fastfood[i].avgCost);

    free(fastfood);

    return 0;
}

输出:

Avg cost = 1.890000 
Avg cost = 2.320000 
Avg cost = 3.560000