@koya98

Как отсортировать повторяющиеся строки на языке СИ?

Всем привет! Делаю курсовую работу по теме "База Данных" на двусвязном списке.По условию требуется создать функцию которая выводит все товары с одинаковой датой поступления в магазин.Как реализовать эту функцию?

Код программы прилагаю

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <malloc.h>
#define charlenght 100


struct dllist
{
    char jewname[charlenght];
    char stonetype[charlenght];
    float stoneweight;
    int stonecount;
    float weightkarat;
    float cost;
    char arive[charlenght];
    struct dllist *sled;
    struct dllist *pred;
};

struct dllist *head;
void addtolist();
void delinlist(int pos);
void printlist();
void sortList();
void searchInList();
void NameSumm();
void ArrivalDate();

int numb = 0;

void addtolist()
{
    struct dllist *node = (struct dllist *)malloc(sizeof(struct dllist));
    printf("Наименованние ювелирного изделия: ");
    scanf("%s", &node->jewname);
    printf("Тип камня: ");
    scanf("%s", &node->stonetype);
    printf("Дата поступления в магазин: ");
    scanf("%s", &node->arive);
    printf("Вес камня(в граммах): ");
    scanf("%f", &node->stoneweight);
    printf("Кол-во камней на изделии: ");
    scanf("%d", &node->stonecount);
    printf("Вес в карат: ");
    scanf("%f", &node->weightkarat);
    printf("Cтоимость(в гривнах): ");
    scanf("%f", &node->cost);
    numb++;
    if (head == NULL)
    {
        node->sled = node;
        node->pred = node;
        head = node;
    }
    else
    {
        struct dllist *p = head;
        for(int i = numb; i > 1; i--) p = p->sled;
        p->pred->sled = node;
        node->pred = p->pred;
        node->sled = p;
        p->pred = node;
    }
    printf("Позиция добавлена \n\n");
}

void delinlist(int pos)
{
    if (head == NULL)
    {
        printf("Список пуст \n\n");
    }
    if (head == head->sled)
    {
        free(head);
        head = NULL;
    }
    else
    {
        struct dllist *a = head;
        for (int i = pos; i > 1; i--) a = a->sled;
        if (a == head) head = a->sled;
        a->pred->sled = a->sled;
        a->sled->pred = a->pred;
        free(a);
    }
    printf("Позиция удалена\n");
}

void printlist()
{
    if (head==NULL) printf("Список пуст\n");
    else
    {
        struct dllist *a = head;
        printf("Позиции :\n ");
        do
        {
            printf("Название юв. изделия: %s\n", a->jewname);
            printf("Тип камня: %s\n", a->stonetype);
            printf("Дата поступления в магазинн: %s\n", a->arive);
            printf("Вес камня: %f грамм\n", a->stoneweight);
            printf("Кол-во камней: %d\n", a->stonecount);
            printf("Вес в карат: %f\n", a->weightkarat);
            printf("Стоимость: %f гривен\n", a->cost);
            a = a->sled;
        }while(a != head);
    }
}

void sortList()
{
    struct dllist *a = head;
    if(head == NULL)
    {
        printf("Список пуст\n");
    }
    else
    {
        float min,max;
        int i;
        printf("\nВведите ваш диапазон \n");
        printf("Минимальная желаемая цена: ");
        scanf("%f",&min);
        printf("Максимальная желаемая цена: ");
        scanf("%f",&max);
        for (i = 0;i < numb;i++)
        {
            if( a->cost >= min && a->cost <=max  )
            {
                printf("Имя позиции : %s  Цена данной позиции : %f \n",a->jewname,a->cost);
            }
            else
            {
                printf("Предметов с ценной в данном диапазоне не обнаруженно \n");
            }

        }


    }printf("\n\n");

}

void searchInList()
{
    struct dllist *a = head;
    char opt[charlenght];
    if (head == NULL)
    {
        printf("Список пуст\n");
    }
    else
    {
        int i;
        printf("\nВведите ваш критерий поиска: ");
        scanf("%s",&opt);
        printf("По вашему критерию найдены такие позиции: \n");
        for (i = 0;i < numb; i++)
        {
            if(strcmp(a->jewname, opt)|| strcmp(a->stonetype,opt))
            {

                printf("Наименованние ювелирного изделия : %s || Тип камня ювелирного изделия %s \n",a->jewname,a->stonetype);
            }
            else
            {
                printf("Позиций с вашими критериями отсутствуют \n");
            }
        }
    }
}

void NameSumm()
{
       struct dllist *a = head;
       char name[charlenght];
       int summ=0;
       int i;
       if(head == NULL)
       {
           printf("Cписок пуст!\n");
       }
       else
       {
           printf("Введите название ювелирного изделия \n");
           scanf("%s",name);
           for(i = 0;i<numb;i++)
           {
               if(strcmp(a->jewname,name ) == 0)
               {
                   summ+=a->cost;
               }
               else
               {
                   printf("Изделий по данному имени не найдено\n");
               }
           }
            printf("Стоимость всех изделий по введеному имени составляет: %d \n",summ);
       }
}

void ArrivalDate()
{
       int i;
       char date = [charlenght];
       struct dllist *a = head;
       if(head == NULL)
       {
           printf("Список пуст!\n");
       }
       do
       {
           for(i = 0;i<numb;i++)
           {
                date[i]=a->arive;
           }
       }while(a != head);
       printf("\n\n");

}

int main()
{
    system("chcp 1251");
    system("cls");
    int pos, n;
    do
    {
        printf("1. Добавить позицию\n");
        printf("2. Удалить позицию\n");
        printf("3. Вывести список всех позиций\n");
        printf("4. Сортировка цен в заданном диапазоне\n");
        printf("5. Поиск позиций по заданному описаннию\n");
        printf("6. Сумма стоимости изделий по имени\n");
        printf("7. Вывод изделий с одинаковой датой поступления\n");
        printf("0. Завершить\n");
        printf("Введите номер действия --> ");
        scanf("%d", &n);
        switch (n)
            {
                case 1:
                    addtolist();
                    break;
                case 2:
                    printf("Введите порядковый номер данной позиции");
                    scanf("%s",&pos);
                    delinlist(pos);
                    break;
                case 3:
                    printlist();
                    break;
                case 4:
                    sortList();
                    break;
                case 5:
                    searchInList();
                    break;
                case 6:
                    NameSumm();
                    break;
                 case 7:
                    ArrivalDate();
                    break;
            }
        }while(n != 0);
}
  • Вопрос задан
  • 75 просмотров
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Проходите по списку и выводе все строки где дата равна указанной. Все.
Зачем тут сортировка?

В плане сортировки и учитывая, что тема Базы данных, то если смотреть на любую реляционную СУБД, то там сортировка данных достигается за счет создания индексов. Индексы это отдельные (от данных) сущности, т.е. физически порядок данных не меняется, но существует отдельный отсортированный список "указателей на данные".
Справедливости ради стоит сказать, что в СУБД существуют и "кластерные индексы" - это такой индекс, который определяет физическую сортировку данных, т.е. данные физически располагаются в хранилище в порядке указанном в кластерном индексе. Но такой индекс может быть только один для одного набора данных (таблицы), а обычных индексов может быть сколько угодно.

Исходя из вышеописанного вы можете создать индекс по дате поступления. Индекс может представлять собой отсортированный массив указателей на данные, двусвязный список указателей или бинарное дерево указателей или что-то еще. При этом сам список данных останется прежним.
Самый простой вариант массив указателей. Сортировать его можно с помощью стандартного qsort(), поиск производить с помощью бинарного поиска bsearch(). При добавлении или удалении элемента в данные, придется либо полностью перестраивать индекс, либо вручную добавлять/удалять элемент из индекса. В любом случае это будет достаточно затратной операцией.
В двусвязном списке и бинарном дереве со вставкой и удалением все проще и гораздо быстрее. В этом случае проще всего генерировать индекс сразу по мере добавления данных, тогда индекс будет строится вместе со списком данных. Но это соответственно скажется на скорости этих операций. Бинарное дерево лучше реализовывать сразу сбалансированное. Работа с подобными структурами сильно усложнит ваш проект и возможно не совсем вписывается в рамки курсового проекта. Это уже вам решать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы