Разработать модуль, реализующий динамическую структуру очередь - C (СИ)
Формулировка задачи:
Условие: Разработать модуль, реализующий динамическую структуру очередь. Выполнить
обработку данных согласно варианту задания: дан текстовый файл со списком машин (структура=Марка Модель [Серийный номер], Год выпуска, Цвет), записать в бинарный файл все машины, той же марки, что и последняя машина в исходном файле. Поправьте, пожалуйста. Я запуталась
//main
////модуль Н
//модуль С
исходник можете глянуть ниже
#include <stdio.h> #include <string.h> #include "modul.h" int main(int argc, char *argv[]) { QUEUE ar; Create(&ar); FILE *f=NULL; if(argc<2) {printf("Not name!\n"); return 1;} CAR val; char st[21]; f = fopen(argv[1],"r+"); if(!f) {printf("File don't found!\n"); return 1;} while(!feof(f)){ if(5 != fscanf(f,"%s %s [%u], %u, %u \n", val.marka, val.model, &val.serial, &val.year, &val.colour)); break; Put(&ar,&val); strcpy(st,val.marka); } fclose(f); FILE *r=NULL; if((r=fopen("data.bin","wb"))==NULL){puts("error"); fclose(f); return 0;} while(Get(&ar,&val)) if(strcmp(val.marka,st)==0) fwrite(&val,sizeof(CAR),1,r); fclose(r); Clear(&ar); return 0; }
#ifndef MODULH #define MODULH void Show(char *); typedef struct{ char marka[15], model[15]; unsigned short year; unsigned char colour[3],serial[7]; } CAR; typedef struct _Element{ CAR value; struct _Element *next; }Element; typedef struct{ Element *head, *tail; }QUEUE; void Create(QUEUE*); void Clear(QUEUE*); int Put(QUEUE*,CAR*); int Get(QUEUE*,CAR*); #endif
#include <stdio.h> #include <string.h> #include <stdlib.h> #include "modul.h" ///создание void Create(QUEUE *queue) { queue->head = queue->tail = NULL; } void Clear(QUEUE *queue) { while(queue->head){ Element *tmp = queue->head; queue->head = tmp->next; free(tmp); } queue->tail = NULL; } //помещаем элемент в очередь int Put(QUEUE *queue, CAR *val) { Element *tmp = (Element*)malloc(sizeof(Element)); if(!tmp) return 0; tmp->next = NULL; tmp->value = *val; if(queue->tail) queue->tail->next = tmp; queue->tail = tmp; if(!queue->head) queue->head = queue->tail; return 1; } //изьятие элемента из очереди int Get(QUEUE *queue, CAR *val) { if(!queue->head) return 0; Element *tmp = queue->head; queue->head = tmp->next; *val = tmp->value; free(tmp); if(!queue->head) queue->tail = NULL; return 1; }
Решение задачи: «Разработать модуль, реализующий динамическую структуру очередь»
textual
Листинг программы
//помещаем элемент в очередь int Put(QUEUE *queue, CAR *val) { Element *tmp; tmp = (Element*) malloc(sizeof(Element)); if (tmp == NULL) return 0; tmp->next = NULL; tmp->value = *val; if (queue->tail != NULL) { queue->tail->next = tmp; queue->tail = tmp; } if (queue->head == NULL) queue->head = queue->tail = tmp; /* if (!queue->head) queue->head = queue->tail; */ return 1; }
Объяснение кода листинга программы
В данном коде реализуется функция Put
, которая добавляет элемент в очередь.
- Создаётся новый элемент
tmp
с помощьюmalloc
. - Если
tmp
равенNULL
, то возвращается 0, иначе: tmp
инициализируется как узел:tmp->next
устанавливается вNULL
, аtmp->value
присваивается значению*val
.- Если очередь не пуста, то новый узел
tmp
добавляется в конец очереди, становясьtail
(последним элементом). - Если очередь пуста, то
head
(первый элемент) иtail
(последний элемент) указывают наtmp
. - Возвращается 1.
Код использует динамическую структуру данных - очередь, представленную с помощью связного списка. В данном случае, каждый элемент списка является структурой
Element
, содержащей два поля:next
(указатель на следующий элемент) иvalue
(значение элемента). Также в коде используется указательqueue
, который содержит информацию о текущем состоянии очереди. Поляhead
иtail
указывают на начало и конец очереди соответственно.