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

问题描述 投票:1回答:2

我需要先打印并按最低成本对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;
}
c sorting structure
2个回答
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 

2
投票

编辑:显然,您可以使用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有望帮助您

© www.soinside.com 2019 - 2024. All rights reserved.