2013-11-07 3 views
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; 
} 
+0

Каких сортировки вы пробовали? – m0skit0

+5

Да, вы можете использовать qsort, но прежде чем вы начнете думать о сортировке, я бы посоветовал вам немного почитать о том, как использовать структуры и массивы. Наличие нескольких структур с одинаковыми определениями - не выход. Если вы хотите хранить данные о ресторанах, создайте для них тип структуры, а затем массив, чтобы держать отдельные рестораны. – jpw

ответ

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 
+0

благодарю вас за ответ. это в точности то, что я планировал достичь. Я не могу обмотать голову, думая в коде, так что это очень помогает. У меня есть небольшая проблема, хотя .. malloc дает мне ошибку. Это дает мне -> значение типа «void *» не может использоваться для инициализации объекта типа «ресторан *» – mebrunner24

+0

@ mebrunner24, я думаю, что вы видите эту ошибку, потому что ваша система может не поднять , которая должна быть видна на C++, но для обычного C вы должны использовать: #include . Посмотрите на мой код наверху, попробуйте это вместо этого. –

+0

Я использую заголовок #include . Он отлично работал на вашей машине? – mebrunner24

2

EDIT: Видимо, вы можете использовать QSort, но вы действительно должны прочитать это, прежде чем делать что-нибудь еще. И почитайте о том, как использовать структуры, а также связанные списки

Метод 1

Я также считаю, вы должны настроить структуры в виде связанного списка, который будет сортировать, как элементы добавляются к нему. Нет необходимости иметь индивидуальные структуры для каждого поставщика продуктов питания. Скорее всего, вы можете иметь что-то вроде этого:

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

Так что теперь, когда вы добавляете на структуру вы включить его в связанный список, и вид, как вы добавляете детали.

Допустит, у вас уже есть 3 в структурах списка с ценой они средней следующим образом:

5-10-15

Так что первая структура с ценой они средней 5 имеет указатель под названием next указывая на struct с ценой avg 10, которая, в свою очередь, имеет указатель под названием next для структуры со средней ценой 15.

Теперь вы хотите добавить цепочку со средней ценой 13 в этот список, вам нужно будет иметь какой-то метод добавления, который будет работать следующим образом:

Помните, что сначала необходимо иметь несколько переменных ... один - это структура, которая называется головкой, указывающей на первый элемент в вашем списке (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; 
    } 
} 

Что это будет сделать, это вставить 13 в списке до 15

Позвольте мне объяснить, что делает это в то время как петля ... вы должны иметь условный набор для temp->next != null, потому что если вы попытаетесь доступ к информации из нулевого указателя, вы получите segFault.

Однажды в цикле вы проверите, имеет ли узел впереди более высокий avgCost, чем тот узел, который вы пытаетесь вставить. Итак, temp указывает на 5, вы проверяете, превышает ли avgCost следующего узла больше 13, но его 10, поэтому вы перемещаетесь вперед в списке, устанавливая temp = узел с 10. Теперь, когда вы находитесь в 10, вы проверяете на см., если следующий узел (15) больше 13 ... ну это ...так что вы все еще на 10, и вы хотите установить этот узел рядом с структурой, которую хотите добавить, но прежде чем вы это сделаете, вам нужно установить узел, который вы хотите добавить (13), следующий указатель на то, что в настоящий момент указывает temp->next to, иначе вы потеряете этот узел, потому что ничто не будет указывать на него, как только вы укажете следующий указатель 10 на узел 13.

Я знаю, что это очень долго и может быть ABIT сложным, поэтому здесь это метод, который я лично не хотел бы использовать, но он должен работать

Метод 2

У вас есть фиксированный массив из структур, но это также будет работать только в том случае, если вы используете один тип структуры (то есть fastFoodVendor, который я перечислял выше), и у вас есть фиксированный массив, который вы можете сортировать так, как если бы вы использовали обычный массив, но я до сих пор не верю, что вы способный использовать qSort, поэтому вам придется разработать собственный метод сортировки и изменения элементов в массиве. Причина, по которой я бы не выбрал этот метод, состоит в том, что накладные расходы и много времени впустую (в зависимости от того, сколько данных вы имеете в виду, для вашего случая я предполагаю, что разница незначительна). Одна из лучших вещей о C - то, как у нее есть способность быть динамичной, и это то, что делает связанный список.

Посмотрите на этот связанный список учебника:http://www.cprogramming.com/tutorial/c/lesson15.html следует надеяться помочь

+0

+1 за то, что нашли время ответить :) Однако использование qsort для сортировки массива структур действительно возможно. Просто используйте функцию сортировки, используя элемент struct, который вы хотите отсортировать. – jpw

+0

@jpw да, я видел ваш комментарий, поэтому я редактировал мой: P. Я забыл, что с qSort вы вводите свою собственную функцию сортировки, но к тому времени, когда я получаю функцию сортировки вниз, возможно, также сделал динамический связанный список. – Adjit

+0

Позвольте мне попробовать это, и я вернусь к вам. Я помню, как узнал о темпе-> следующий в классе на днях. Я не думал об этом. – mebrunner24

Смежные вопросы