Вывод повторяющихся строк в программе

Всем привет,имею двусвязный список на языке си. По условию требуется сделать функцию которая выводит позиции с одинаковыми датами прибытия в магазин

Полный код программы прилагаю:


    #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++)
           {
              if
           }
       }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);
}




Ответы (1 шт):

Автор решения: Sergey

как оформить эту самую проверку одинаковых строк

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

  1. Сортируем исходные данные
  2. Просматриваем результат, сравнивая два соседних элемента

Я надеюсь, рассказывать, как просмотреть массив элементов, Вам не нужно. По поводу сортировки. В стандартных библиотеках С есть отличная функция:

man 3 qsort
DESCRIPTION
       The qsort() function sorts an array with nmemb elements of size 

Проблема в том, что эта функция сортирует массив, а не список. Значит надо преобразовать список в массив. Для этого:

  1. Считаем, сколько элементов в списке
  2. Выделяем память под массив соответствующего размера
  3. Пробегаем весь список, копируя его элемент в очередной элемент массива.

Подсчёт числа элементов в списке довольно очевиден:

struct dllist *a = head;
int list_len;

list_len = 0; 

while(a != NULL) {
    list_len++;
    a = a->sled;
};

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

size_t mem_size = list_len * sizeof(struct dllist);
void *mem = malloc(mem_size);

Теперь займёмся копированием:

struct dllist *array;

*a = head;
array = (struct dllist *)mem;

for(j=0; j<list_len; j++) {
    memcpy(&array[j], a, sizeof(struct dllist));
    a = a->sled;
}

Всё готово и можно вызывать стандартную функцию сортировки:

qsort(mem, list_len, sizeof(struct dllist), compare);

Осталось только разобраться с функцией compare(), которая должна сравнивать два элемента массива, по значению полей arive. Эту функцию надо определить до её использования как-то так:

int compare(const void *p1, const void *p2) {
    struct dllist *a1;
    struct dllist *a2;

    a1 = (struct dllist *)p1;
    a2 = (struct dllist *)p2;

    return strcmp(a1->arive, a2->arive);

}

Обратите внимание на тот факт, что стандартная функция сравнения строк strcmp() требует на входе нуль-терминированные строки. В 99.9% случаев это так, но вдруг...

Вот и всё, собственно... Осталось пробежаться по отсортированному массиву от начала до конца, сравнивая два соседних элемента array[j] и array[j+1]. Если у них сопадают поля arive, то печатаем их как результат поиска.

→ Ссылка