scanf("%s",x->inf.avt);
printf("Введите название книги:\n");
scanf("%s",x->inf.nazv);
printf("Введите год издания книги:\n");
scanf("%d",&x->inf.god);
while(x->inf.god<0)
{
printf("Год издания не может быть отрицательным числом! Введите повторно!\n");
scanf("%d",&x->inf.god);
}
printf("Введите количество экземпляров книги:\n");
scanf("%d",&x->inf.kol);
while(x->inf.kol<0)
{
printf("Количество книг не может быть отрицательным числом! Введите повторно!\n");
scanf("%d",&x->inf.kol);
}
x2->inf=x->inf; //копирование информационных полей
x2->inf.kol=0; //в начале количество выданных книг-0
printf("Новый элемент добавлен!\n");
x->next=NULL; //обнуление указателя на следующий элемент добавляемого элемента
cur->next=x; //последний (пока что последний)элемент списка указывает на следующий элемент (добавляемый)
x->pred=cur; //указатель на предыдущий элемент нового элемента равен последнему
cur=x; //теперь добавленный элемент-последний
x2->next=NULL; //аналогично для второго списка
cur2->next=x2;
x2->pred=cur2;
cur2=x2;
}
}
//---------------------------------------------------------------------\
void delel(el **top,el **top2) //удаление элементов
{
el *cur=*top,*cur2=*top2; //текущие указатели списков равны указателям на вершины списков
intn=0; //результат поиска
charisk[20]; //фамилия искомого автора
clrscr();
if(cur==NULL) printf("Перед тем, как удалять элементы из списка, создайте его!\n");
else
{
printf("Введите фамилию автора, книги которого должны быть удалены:\n");
scanf("%s",isk); //ввод фамилии искомого автора(он же удаляемый)
while(cur!=NULL) //пока не конец списка
{
if(strcmp(cur->inf.avt,isk)==0) //если фамилия автора у элемента совпадает с введенной
{
n++; //поиск успешен
if(cur==*top) //если удаляемый элемент-вершина
{
*top=(*top)->next; //вершиной становится следующий элемент
cur->next->pred=NULL;и //обнуление указателя новой вершины на предыдущий элемент
free(cur); //освобождение памяти под старую вершину
*top2=(*top2)->next; //по аналогии для второго
cur2->next->pred=NULL;
free(cur2);
}
elseif(cur->next==NULL) //если это-последний элемент списка
{
cur->pred->next=NULL; //ссылка предпоследнего элемента на следующий обнуляется
free(cur); //память под старый конец списка освобождается
cur2->pred->next=NULL; //аналогично для второго
free(cur2);
}
else{
cur->next->pred=cur->pred; //ссылка на следующий элемент у предыдущего элемента (относительно удаляемого) приравнивается следующем элементу
cur->pred->next=cur->next; //ссылка на предыдущий элемент у следующего элемента (относительно удаляемого) приравнивается предыдущему элементу
free(cur); //память освобождается
cur2->next->pred=cur2->pred; //то же для второго
cur2->pred->next=cur2->next;
free(cur2);
}
}
cur=cur->next; //переход к следующему элементу
cur2=cur2->next; //аналогично
}
printf("Было удалено %d книг данного автора",n);
}
getch();
}
//---------------------------------------------------------------------\
voidvozvrat(el *cur,el *cur2) //возвращение элемента
{
char iskA[10],iskN[10];
int n=0;
clrscr();
if(cur==NULL) printf("Перед тем, как производить поиск в списке, необходимо его создать!");
else
{
printf("Введите интересующего Вас автора:\n");
scanf("%s",iskA);
printf("Введите интересующую Вас книгу:\n");
scanf("%s",iskN);
while(cur!=NULL)
{
if((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur2->inf.kol>0) //если есть книги на руках (кол-во>0)
{
cur->inf.kol++; //увеличивается в первом списке количество
cur2->inf.kol--; //уменьшается во втором
n++;
printf("Книга возвращена!");
break;
}
elseif((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur2->inf.kol<=0) //если книг на руках нет
{
printf("Все свои книги дома! Чужих нам не надо)))");
n++;
break;
}
cur=cur->next;
cur2=cur2->next;
}
if(n==0) printf("К сожалению, ни одной такой книги не найдено!\n");
}
getch();
}
//---------------------------------------------------------------------\
void sort(el *top) //сортировка
{
intk=1; //вспомогательный элемент, показывает были ли перестановки или нет
el* cur; //указатель на текущий элемент
bookdop; //переменная для временного хранения данных (используется при сортировке)
clrscr();
if(top==NULL) printf("Перед тем, как сортировать список, необходимо его создать!");
else
{
while(k!=0) //пока не будет перестановок
{
k=0; //перстановок нет
for(cur=top;cur->next!=NULL;cur=cur->next) //пока указатель на следующий элемент у текущего не равен NULL
if(strcmp(cur->inf.avt,cur->next->inf.avt)>0) //если следующий элемент меньше, чем текущий
{
dop=cur->inf; //занесение в буфер данных текущего элемента
cur->inf=cur->next->inf; //переписывание в текущий данные следующего
cur->next->inf=dop; //переписывание в следующий данные из буфера
k=1; //перестановки есть
}
}
}
}
//---------------------------------------------------------------------\
voidsaveIT(el *cur,el *cur2) //сохранение в файл
{
FILE *f1,*f2; //файлы
f1=fopen("Base.txt","wb"); //файл для первого списка
f2=fopen("Out.txt","wb"); //для второго
if(f1==NULL||f2==NULL) printf("Чтоё-то не грузится: глюк)");
else
{
while(cur!=NULL) //пока не конец списка
{
fwrite(&cur->inf,sizeof(el),1,f1); //запись данных текущего элемента в файл
fwrite(&cur2->inf,sizeof(el),1,f2); //то же
cur=cur->next; //переход к следующему элементу
cur2=cur2->next; //то же
}
printf("Списки сохранены успешно!");
fcloseall(); //закрытие файлов
}
getch();
}
//---------------------------------------------------------------------\
voidloadIT(el **top,el **top2) //чтение файлов
{
el *cur,*pr,*tail,*tail2,*cur2; //указатели
FILE *f1,*f2; //файлы
clrscr();
*top2=*top=tail=tail2=NULL; //обнуление ссылок на хвост и вершину
f1=fopen("Base.txt","rb"); //открытие файла Base.txt
f2=fopen("Out.txt","rb"); //открытие файла Out.txt
if(f1==NULL||f2==NULL) printf("Чтоё-то не грузится: глюк)");//если файлов нет
else
{
while(!feof(f1)) //пока не конец файла
{
cur=(el*)malloc(sizeof(el)); //выделение памяти под новый элемент (далее текущий)
cur->next=NULL; //обнуление указателя на следующий элемент текущего элемента
cur->pred=tail; //присваивание указателя на предыдущий элемент текущего элемента хвосту списка
if((*top)==NULL) (*top)=cur; //если указатель на начало списка пуст, то указателем на начало списка становится текущий элемент
elsetail->next=cur; //если нет, то указателем на хвост списка становится текущий элемент
tail=cur; //указатель на хвост становится приравнивается текущему элементу
cur2=(el*)malloc(sizeof(el)); //аналогично для второго элемента
cur2->next=NULL;
cur2->pred=tail2;
if((*top2)==NULL) (*top2)=cur2;
else tail2->next=cur2;
tail2=cur2;
fread(&cur->inf,sizeof(el),1,f1); //считывание с файла
fread(&cur2->inf,sizeof(el),1,f2);
}
fcloseall(); //закрываем файлы
printf("Списки успешно загружены из файлов!");
}
getch();
}
//---------------------------------------------------------------------\
voidmain() //основная программа
{
int n=0;
el *top=NULL,*top2=NULL;
while(n!=11)
{
clrscr();
printf("Введите номер пункта для выполнения:\n");
printf("1.Заполнить список\n");
printf("2.Загрузить списки из файлов\n");
printf("3.Отсортировать текущий список\n");
printf("4.Вывести текущий список\n");
printf("5.Вывести текущий список выданных на руки книг\n");
printf("6.Добавить новый элемент\n");
printf("7.Удалить из списка книги заданного автора\n");
printf("8.Выдать книгу на руки\n");
printf("9.Вернуть книгу в библиотеку\n");
printf("10.Сохранить списки в файл\n");
printf("11.Выход из программы\n");
printf("Ваш выбор:\n");
scanf("%d",&n);
while(n>11||n<1)
{
printf("Такого пункта нет! Введите повторно:\n");
scanf("%d",&n);
}
if(n==1) top=vvodSp(&top2);
else if(n==2) loadIT(&top,&top2);
else if(n==3) {sort(top); sort(top2);}
else if(n==4) vivodSp(top);
else if(n==5) vivodSp(top2);
else if(n==6) {dobEl(top,top2); sort(top); sort(top2);}
else if(n==7) delel(&top,&top2);
else if(n==8) vidacha(top,top2);
else if(n==9) vozvrat(top,top2);
else if(n==10) saveIT(top,top2);
}
}
Приложение Б
Результаты работы программы