1

我需要先打印出整数并按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;
}
4

2 回答 2

2

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

方法一

我也相信你应该将你的结构设置为一个链表,当元素添加到其中时,它会进行排序。不必为每个食品供应商提供单独的结构。相反,你可以有这样的东西:

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

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

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

5-10-15

因此,平均价格为 5 的第一个结构有一个指针next,该指针指向平均价格为 10 的结构,而该结构又具有一个指向next平均价格为 15 的结构的指针。

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

请记住,您首先必须有一些变量......一个是一个fastFoodVendor名为 head 的结构,指向列表中的第一个元素(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 节点,就没有任何东西指向它。

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

方法二

你有一个固定的结构数组,但这也只有当你使用一种类型的结构(即fastFoodVendor我上面列出的)并且有一个固定的数组,你可以像普通数组一样排序,但我仍然没有相信您将能够使用 qSort,因此您必须开发自己的方法来对数组中的内容进行排序和更改。我不会选择这种方法的原因是因为有很多开销,并且浪费了很多时间(取决于您要处理的数据量,对于您的情况,我假设差异可以忽略不计)。C 语言最好的事情之一是它具有动态能力,这就是链表正在做的事情。

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

于 2013-11-07T22:05:55.483 回答
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 
于 2013-11-07T23:26:22.507 回答