我需要先打印并按最低成本对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;
}
也许您可以尝试以下示例,然后在avgCost上使用冒泡排序(您可以找到性能更好的排序器,但这只是为了说明)。
我喜欢链接列表的想法,即实现为优先级队列,但是下面的代码为您提供了另一个示例可供考虑。请注意,我将您的数据设置为指向结构体数组的指针,而不是为每个食品供应商设置为单独的结构体(如metsales和jpw的注释中所述)。
另外,您是否不希望使用float变量作为费用?我继续进行设置。
希望这会有所帮助。
#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
编辑:显然,您可以使用qSort,但是在执行任何其他操作之前,应该真正阅读此内容。并阅读有关如何使用结构以及链接列表的信息
方法1
我也相信您应该将结构设置为链接列表,并在添加元素时对其进行排序。每个食品供应商都不必具有单独的结构。相反,您可以拥有这样的内容:
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的链,您将需要某种可以按如下方式工作的添加方法:
请记住,首先必须有几个变量...一个是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,就不会指向该节点。节点。
我知道这确实很长,可能有点复杂,所以这是一种方法,我个人不会使用,但应该可以使用。
方法2
您有一个固定的结构数组,但是仅当您使用一种类型的结构(即我上面列出的fastFoodVendor
)并且具有可以像普通数组一样进行排序的固定数组时,这也将起作用我仍然不相信您将能够使用qSort,因此您将不得不开发自己的方法来对数组中的内容进行排序和更改。我之所以不选择这种方法,是因为有很多开销,并且浪费了很多时间(取决于您要处理的数据量,对于您的情况,我认为差异可以忽略不计)。关于C的最好的事情之一是它具有动态能力,这就是链表的作用。
看一下此链表教程: http://www.cprogramming.com/tutorial/c/lesson15.html有望帮助您