编辑:显然你可以使用 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应该有帮助