Разработать модуль, реализующий динамическую структуру очередь - 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, которая добавляет элемент в очередь.

  1. Создаётся новый элемент tmp с помощью malloc.
  2. Если tmp равен NULL, то возвращается 0, иначе:
  3. tmp инициализируется как узел: tmp->next устанавливается в NULL, а tmp->value присваивается значению *val.
  4. Если очередь не пуста, то новый узел tmp добавляется в конец очереди, становясь tail (последним элементом).
  5. Если очередь пуста, то head (первый элемент) и tail (последний элемент) указывают на tmp.
  6. Возвращается 1. Код использует динамическую структуру данных - очередь, представленную с помощью связного списка. В данном случае, каждый элемент списка является структурой Element, содержащей два поля: next (указатель на следующий элемент) и value (значение элемента). Также в коде используется указатель queue, который содержит информацию о текущем состоянии очереди. Поля head и tail указывают на начало и конец очереди соответственно.

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы