Сформировать очеред содержащую весенние даты, упорядоченные только по

  • Автор темы maryfly009
  • Дата начала
M

maryfly009

#1
Здравствуйте. Помогите пожалуйста дорешать задачу:
Дан текстовый файл, содержащий даты в формате «день/месяц/год», причем под день месяц отводится по две позиции, а под год – четыре (например, «16/04/2001»). Сформировать очередь содержащую весенние даты, упорядоченные только по месяцу и числу.

Задача почти решена:
C++:
#include <stdio.h>
#include <stdlib.h> 
#include <string.h> 
int Put(int, int, int);  
int Get(int*, int*, int*);

int main()
{
int day, month, year;
char filename[50] = "data.txt";
char str[50];
FILE *f;

if((f = fopen(filename, "r")) == NULL)
{
puts("Nevozmozhno otkrit fail!");
return 0;
}

printf("Soderhimoe faila:\n");
while(!feof(f))
{
if(fgets(str,100,f) == NULL) break;
if(str[strlen(str)-1] == '\n') str[strlen(str)-1] = 0;
printf("%s\n", str);

sscanf(str, "%d/%d/%d", &day, &month, &year);

if(month > 2 && month < 6)
{
if(Put(day, month, year))
{	
//Помещение в очередь
//и проверка результата
puts("Nehvataet pamyati!");
break;
}
}
}
fclose(f);

printf("\nRezultat:\n");
//Цикл пока в очереди есть значения
while(!Get(&day, &month, &year)) 
(day < 10 && month < 10) ? printf("0%d/0%d/%d\n", day, month, year) : (day < 10 && month > 9) ? printf("0%d/%d/%d\n", day, month, year) : printf("%d/0%d/%d\n", day, month, year);

return 0;
}

/* ----- Описание структуры и указателей на очередь ---- */
typedef struct _Element{
int day;
int month;
int year;
struct _Element *next;
} Element;
Element *head = NULL, *tail = NULL;


/* --------- Функция помещения значения в очередь --------- */
int Put(int day, int month, int year)
{
//Выделение памяти под новый элемент
Element *tmp = (Element *)malloc(sizeof(Element));
if(!tmp) return 1; //Если память не выделилась, то выход
//Инициализация ссылки на следующий элемент в очереди 
tmp->next = NULL;				 //нулевым значением

tmp->day = day; //Запись значения в новый элемент
tmp->month = month; //Запись значения в новый элемент
tmp->year = year; //Запись значения в новый элемент

//Связывание последнего элемента в очереди с новым 
if(tail) tail->next = tmp;			 //элементом
tail = tmp; //Установка указателя на конец очереди
//Если это первый элемент, то установка указателя
if(!head) head = tmp;		 //на начало очереди
return 0; //Успешное завершение
}

/* --------- Функция получения значения из очереди --------*/
int Get(int* day, int* month, int* year)
{
if(!head) return 1; //Если очередь пуста, то выход

Element *tmp = head; //Установка локального указателя

*day = tmp->day;//Запись значения в параметр
*month = tmp->month;//Запись значения в параметр
*year = tmp->year;//Запись значения в параметр

head = head->next;  //Установка нового начала очереди
free(tmp);
//Если это последний элемент, то инициализация указателя 
if(!head) tail=NULL; //на конец очереди нулевым значением

return 0;  //Успешное завершение
}
Из условия не могу понять, вот этот фрагмент Сформировать очеред содержащую весенние даты, упорядоченные только по месяцу и числу.
Насколько я знаю над очередью можно выполнять три операции: добавление элементов, удаление элемент и очищать её.
А как реализовать упорядочивание элементов очереди по месяцу и числу?

спасибо за ответы!
 

grigsoft

Well-known member
15.11.2005
735
0
#2
Во-первых, тебе надо еще проверить даты на попадание в весенний период, и пропускать неверные значения. А получить упорядоченный список можно 2мя способами - либо отсортировать после наполнения, либо вставлять не в конец, а сразу с учетом порядка.