Если поезд ушёл, значит он был не твой
Здравствуйте!
помогите с прогой!
есть программа:
циклический двунаправленный список структуры описывающие магазины. Из полученного списка исключить магазины не содержищие определенного товара.
нужно переделать в список типа ОЧЕРЕДЬ
и еще компилятор ругается на file (выделенный элемент в проге), типа "is never used"
код
#include
#include
#include
#include
typedef struct address_t{
char city[80];
char street[80];
char house[80];
}address_t;
typedef struct good_t{
char name[80];
char price[80];
char end_date[80];
}good_t;
typedef struct shop_t{
char number[10];
address_t address;
int good_count;
good_t goods[10];
}shop_t;
// Элемент списка
// содержит указатель на структуру данных
// и указатели на следующий и предыдущий элемент списка
typedef struct Record{
shop_t *data;
Record *next;
Record *prev;
}Record;
//Список. Хранит указательна первый элемент списка
typedef struct List{
Record * head;
}List;
//Создаем пустой список
List* create(){
List* lst = (List*)malloc(sizeof(List));
lst->head = NULL;
return lst;
}
//Добавляет данные в список
void add(List *lst, shop_t *data){
// создаем элемент списка
Record *rec = (Record *)malloc(sizeof(Record));
// устанавливаем данные
rec->data = data;
if(lst->head == NULL){
//если список пустой то устанавливаем указатель на первый элемент
lst->head = rec;
rec->next = rec->prev = rec;
}
else{
// добавляем новый элемент перед первым элементом
rec->next = lst->head;
rec->prev = lst->head->prev;
rec->next->prev = rec;
rec->prev->next = rec;
}
}
//Удаляем элемент из списка
void del(List *lst, Record *rec){
if(lst->head == rec){
if(lst->head == lst->head->next){
// Если это единственный элемент списка - делаем список пустым
lst->head = NULL;
}
else{
// Если в списке есть еще элементы и мы удаляем первый,
// то первым элементом становится следующий
lst->head = lst->head->next;
}
}
//Удаляем элемент из списка.
rec->next->prev = rec->prev;
rec->prev->next = rec->next;
//Освобождаем память из под элемента
//ВНИМАНИЕ! Память из под данных не освобождается
free((void*)rec);
}
//Создает список и загружает данные из файла
List* LoadFromFile(char *file, FILE *fp){
//Создаем новый пустой список
List *lst = create();
while(!feof(fp)){
//выделяем память для данных
shop_t *data = (shop_t*)malloc(sizeof(shop_t));
// читаем данные из файла построчно
fscanf(fp, "%[^\n]\n", data->number);
fscanf(fp, "%[^\n]\n", data->address.city);
fscanf(fp, "%[^\n]\n", data->address.street);
fscanf(fp, "%[^\n]\n", data->address.house);
data->good_count = 0; // число товаров
//Читаем список товаров до того момента пока не будет прочитан '-'
for(int i = 0; igoods[i].name);
if(data->goods[i].name[0] == '-'
break;
fscanf(fp, "%[^\n]\n", data->goods[i].price);
fscanf(fp, "%[^\n]\n", data->goods[i].end_date);
data->good_count = i+1;
}
add(lst, data);
}
return lst;
}
//Сохраняет список в файл
void SaveToFile(List *lst, FILE *fp){
Record *p = lst->head;
if(p == NULL){ //список пуст
return;
}
do{
shop_t *data = p->data;
fprintf(fp, "%s\n", data->number);
fprintf(fp, "%s\n", data->address.city);
fprintf(fp, "%s\n", data->address.street);
fprintf(fp, "%s\n", data->address.house);
for(int i = 0; igood_count; i++){
fprintf(fp, "%s\n", data->goods[i].name);
fprintf(fp, "%s\n", data->goods[i].price);
fprintf(fp, "%s\n", data->goods[i].end_date);
}
fprintf(fp, "-\n"
;
p = p->next;
}while(p != lst->head);
}
//Печатает список на экран
void output(List *lst){
if(lst->head == NULL){
printf("Список пуст!"
;
return;
}
Record *p = lst->head;
do{
shop_t *data = p->data;
printf("Numer %s\n", data->number);
printf("City %s\n", data->address.city);
printf("Street %s\n", data->address.street);
printf("House %s\n", data->address.house);
for(int i = 0; igood_count; i++){
printf("Good #%d\n", i);
printf("Name %s\n", data->goods[i].name);
printf("Price %s\n", data->goods[i].price);
printf("Date %s\n", data->goods[i].end_date);
}
p = p->next;
}while(p != lst->head);
}
// находит магазин который не содержит указанный товар
Record * find_good(List *lst, char *good){
Record *p = lst->head;
if(p == NULL){
return p;
}
do{
shop_t *data = p->data;
int is_find = 0;
for(int i = 0; igood_count; i++){
if(strcmp(data->goods[i].name, good)==0){
is_find = 1;
break;
}
}
if(is_find == 0)
return p;
p = p->next;
}while(p != lst->head);
return NULL;
}
int main(){
char str[255];
char ch;
List *lst = NULL;
printf("Курсовая работа. Вариант №20""\n"
;
printf("\n"
;
printf("\n"
;
printf("\n"
;
printf("Загрузить в циклический двунаправленный список структуры описывающие магазины.""\n"
;
printf("Из полученного списка исключить магазины не содержищие определенного товара.""\n"
;
printf("Нажмите любую клавишу для продалжения..."
;
getch();
//Загрузка входных данных
for( ; ; ) {
clrscr();
printf("Введите имя входного файла:\n"
;
scanf("%s", str);
FILE *fp = fopen(str, "r"
;
if(!fp){
fprintf(stderr, "ОШИБКА! Невозможно открыть файл \"%s\"!", str);
printf("\nВвести имя файла заново?(y/n):"
;
ch = getch();
if((ch == 'y'
|| (ch == 'Y'
){
continue; // повторить ввод
}
printf("\nКонец работы программы.\nНажмите любую клавишу для выхода..."
;
getch();
return -1;
}
fpos_t cur_pos;
fgetpos(fp, &cur_pos);
fgetc(fp);
if(feof(fp)){
fprintf(stderr, "ОШИБКА! Файл \"%s\" пустой!", str);
fclose(fp);
printf("\nВвести имя файла заново?(y/n):"
;
ch = getch();
if((ch == 'y'
|| (ch == 'Y'
){
continue;
}
printf("\nКонец работы программы.\nНажмите любую клавишу для выхода..."
;
getch() ;
return -1;
}
fsetpos(fp, &cur_pos);
lst = LoadFromFile(str, fp);
fclose(fp);
break;
}
clrscr();
printf("Конец загрузки списка из файла!\n"
;
printf("Нажмите любую клавишу для продалжения..."
;
getch();
clrscr();
printf("Вывести список на экран?(y/n) : "
;
ch = getch();
if((ch == 'y'
|| (ch == 'Y'
){
clrscr();
output(lst);
printf("Нажмите любую клавишу для продалжения..."
;
getch();
}
clrscr();
printf("Введите название товара, магазины с которым надо удалить:\n"
;
scanf(" %s", str);
int count = 0;
while(Record *rec = find_good(lst, str)){
del(lst, rec);
count++;
}
printf("Количество удаленных магазинов: %d\n", count);
printf("Нажмите любую клавишу для продалжения..."
;
getch();
clrscr();
printf("Вывести список на экран?(y/n):"
;
if((getch() == 'y'
|| (getch() == 'y'
){
clrscr();
output(lst);
printf("Нажмите любую клавишу для продалжения..."
;
getch();
}
clrscr();
printf("Сохранить список в файл?(y/n):"
;
ch = getch();
if((ch == 'y'
|| (ch == 'Y'
){
for( ; ; ){
clrscr();
printf("Введите имя выходного файла:\n"
;
scanf("%s", str);
FILE *fp = fopen(str, "w+"
;
if(!fp){
fprintf(stderr, "ОШИБКА! Невозможно открыть файл \"%s\"!", str);
printf("\nВвести имя файла заново?(y/n):"
;
ch = getch();
if((ch == 'y'
|| (ch == 'Y'
){
continue;
}
printf("\nКонец работы программы.\nНажмите любую клавишу для выхода..."
;
getch();
return -1;
}
SaveToFile(lst, fp);
fclose(fp);
clrscr();
printf("Данные успешно сохранены в файл!\n\n"
;
break;
}
}
else{
clrscr();
}
printf("Конец работы программы.\nНажмите любую клавишу для выхода..."
;
getch();
}
помогите с прогой!
есть программа:
циклический двунаправленный список структуры описывающие магазины. Из полученного списка исключить магазины не содержищие определенного товара.
нужно переделать в список типа ОЧЕРЕДЬ
и еще компилятор ругается на file (выделенный элемент в проге), типа "is never used"
код
#include
#include
#include
#include
typedef struct address_t{
char city[80];
char street[80];
char house[80];
}address_t;
typedef struct good_t{
char name[80];
char price[80];
char end_date[80];
}good_t;
typedef struct shop_t{
char number[10];
address_t address;
int good_count;
good_t goods[10];
}shop_t;
// Элемент списка
// содержит указатель на структуру данных
// и указатели на следующий и предыдущий элемент списка
typedef struct Record{
shop_t *data;
Record *next;
Record *prev;
}Record;
//Список. Хранит указательна первый элемент списка
typedef struct List{
Record * head;
}List;
//Создаем пустой список
List* create(){
List* lst = (List*)malloc(sizeof(List));
lst->head = NULL;
return lst;
}
//Добавляет данные в список
void add(List *lst, shop_t *data){
// создаем элемент списка
Record *rec = (Record *)malloc(sizeof(Record));
// устанавливаем данные
rec->data = data;
if(lst->head == NULL){
//если список пустой то устанавливаем указатель на первый элемент
lst->head = rec;
rec->next = rec->prev = rec;
}
else{
// добавляем новый элемент перед первым элементом
rec->next = lst->head;
rec->prev = lst->head->prev;
rec->next->prev = rec;
rec->prev->next = rec;
}
}
//Удаляем элемент из списка
void del(List *lst, Record *rec){
if(lst->head == rec){
if(lst->head == lst->head->next){
// Если это единственный элемент списка - делаем список пустым
lst->head = NULL;
}
else{
// Если в списке есть еще элементы и мы удаляем первый,
// то первым элементом становится следующий
lst->head = lst->head->next;
}
}
//Удаляем элемент из списка.
rec->next->prev = rec->prev;
rec->prev->next = rec->next;
//Освобождаем память из под элемента
//ВНИМАНИЕ! Память из под данных не освобождается
free((void*)rec);
}
//Создает список и загружает данные из файла
List* LoadFromFile(char *file, FILE *fp){
//Создаем новый пустой список
List *lst = create();
while(!feof(fp)){
//выделяем память для данных
shop_t *data = (shop_t*)malloc(sizeof(shop_t));
// читаем данные из файла построчно
fscanf(fp, "%[^\n]\n", data->number);
fscanf(fp, "%[^\n]\n", data->address.city);
fscanf(fp, "%[^\n]\n", data->address.street);
fscanf(fp, "%[^\n]\n", data->address.house);
data->good_count = 0; // число товаров
//Читаем список товаров до того момента пока не будет прочитан '-'
for(int i = 0; igoods[i].name);
if(data->goods[i].name[0] == '-'

break;
fscanf(fp, "%[^\n]\n", data->goods[i].price);
fscanf(fp, "%[^\n]\n", data->goods[i].end_date);
data->good_count = i+1;
}
add(lst, data);
}
return lst;
}
//Сохраняет список в файл
void SaveToFile(List *lst, FILE *fp){
Record *p = lst->head;
if(p == NULL){ //список пуст
return;
}
do{
shop_t *data = p->data;
fprintf(fp, "%s\n", data->number);
fprintf(fp, "%s\n", data->address.city);
fprintf(fp, "%s\n", data->address.street);
fprintf(fp, "%s\n", data->address.house);
for(int i = 0; igood_count; i++){
fprintf(fp, "%s\n", data->goods[i].name);
fprintf(fp, "%s\n", data->goods[i].price);
fprintf(fp, "%s\n", data->goods[i].end_date);
}
fprintf(fp, "-\n"

p = p->next;
}while(p != lst->head);
}
//Печатает список на экран
void output(List *lst){
if(lst->head == NULL){
printf("Список пуст!"

return;
}
Record *p = lst->head;
do{
shop_t *data = p->data;
printf("Numer %s\n", data->number);
printf("City %s\n", data->address.city);
printf("Street %s\n", data->address.street);
printf("House %s\n", data->address.house);
for(int i = 0; igood_count; i++){
printf("Good #%d\n", i);
printf("Name %s\n", data->goods[i].name);
printf("Price %s\n", data->goods[i].price);
printf("Date %s\n", data->goods[i].end_date);
}
p = p->next;
}while(p != lst->head);
}
// находит магазин который не содержит указанный товар
Record * find_good(List *lst, char *good){
Record *p = lst->head;
if(p == NULL){
return p;
}
do{
shop_t *data = p->data;
int is_find = 0;
for(int i = 0; igood_count; i++){
if(strcmp(data->goods[i].name, good)==0){
is_find = 1;
break;
}
}
if(is_find == 0)
return p;
p = p->next;
}while(p != lst->head);
return NULL;
}
int main(){
char str[255];
char ch;
List *lst = NULL;
printf("Курсовая работа. Вариант №20""\n"

printf("\n"

printf("\n"

printf("\n"

printf("Загрузить в циклический двунаправленный список структуры описывающие магазины.""\n"

printf("Из полученного списка исключить магазины не содержищие определенного товара.""\n"

printf("Нажмите любую клавишу для продалжения..."

getch();
//Загрузка входных данных
for( ; ; ) {
clrscr();
printf("Введите имя входного файла:\n"

scanf("%s", str);
FILE *fp = fopen(str, "r"

if(!fp){
fprintf(stderr, "ОШИБКА! Невозможно открыть файл \"%s\"!", str);
printf("\nВвести имя файла заново?(y/n):"

ch = getch();
if((ch == 'y'


continue; // повторить ввод
}
printf("\nКонец работы программы.\nНажмите любую клавишу для выхода..."

getch();
return -1;
}
fpos_t cur_pos;
fgetpos(fp, &cur_pos);
fgetc(fp);
if(feof(fp)){
fprintf(stderr, "ОШИБКА! Файл \"%s\" пустой!", str);
fclose(fp);
printf("\nВвести имя файла заново?(y/n):"

ch = getch();
if((ch == 'y'


continue;
}
printf("\nКонец работы программы.\nНажмите любую клавишу для выхода..."
getch() ;
return -1;
}
fsetpos(fp, &cur_pos);
lst = LoadFromFile(str, fp);
fclose(fp);
break;
}
clrscr();
printf("Конец загрузки списка из файла!\n"

printf("Нажмите любую клавишу для продалжения..."

getch();
clrscr();
printf("Вывести список на экран?(y/n) : "

ch = getch();
if((ch == 'y'


clrscr();
output(lst);
printf("Нажмите любую клавишу для продалжения..."

getch();
}
clrscr();
printf("Введите название товара, магазины с которым надо удалить:\n"

scanf(" %s", str);
int count = 0;
while(Record *rec = find_good(lst, str)){
del(lst, rec);
count++;
}
printf("Количество удаленных магазинов: %d\n", count);
printf("Нажмите любую клавишу для продалжения..."

getch();
clrscr();
printf("Вывести список на экран?(y/n):"

if((getch() == 'y'


clrscr();
output(lst);
printf("Нажмите любую клавишу для продалжения..."

getch();
}
clrscr();
printf("Сохранить список в файл?(y/n):"

ch = getch();
if((ch == 'y'

for( ; ; ){
clrscr();
printf("Введите имя выходного файла:\n"

scanf("%s", str);
FILE *fp = fopen(str, "w+"

if(!fp){
fprintf(stderr, "ОШИБКА! Невозможно открыть файл \"%s\"!", str);
printf("\nВвести имя файла заново?(y/n):"

ch = getch();
if((ch == 'y'


continue;
}
printf("\nКонец работы программы.\nНажмите любую клавишу для выхода..."

getch();
return -1;
}
SaveToFile(lst, fp);
fclose(fp);
clrscr();
printf("Данные успешно сохранены в файл!\n\n"

break;
}
}
else{
clrscr();
}
printf("Конец работы программы.\nНажмите любую клавишу для выхода..."

getch();
}
@темы: прога
Этот указатель не используется в функции. Следовательно нафик он нужен