Вывод повторяющихся строк в программе
Всем привет,имею двусвязный список на языке си. По условию требуется сделать функцию которая выводит позиции с одинаковыми датами прибытия в магазин
Полный код программы прилагаю:
#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 шт):
как оформить эту самую проверку одинаковых строк
Ну, в одну строчку это не получится. Вообще, основная идея всех алгоритмов поиска совпадающих значений заключается в простом алгоритме:
- Сортируем исходные данные
- Просматриваем результат, сравнивая два соседних элемента
Я надеюсь, рассказывать, как просмотреть массив элементов, Вам не нужно. По поводу сортировки. В стандартных библиотеках С есть отличная функция:
man 3 qsort
DESCRIPTION
The qsort() function sorts an array with nmemb elements of size
Проблема в том, что эта функция сортирует массив, а не список. Значит надо преобразовать список в массив. Для этого:
- Считаем, сколько элементов в списке
- Выделяем память под массив соответствующего размера
- Пробегаем весь список, копируя его элемент в очередной элемент массива.
Подсчёт числа элементов в списке довольно очевиден:
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, то печатаем их как результат поиска.