我需要首先以最低成本打印并排序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;
}
答案 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