Смекни!
smekni.com

Обработка динамических структур (стр. 4 из 4)

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("Год издания не может быть отрицательным числом! Введите повторно!&bsol;n");

scanf("%d",&x->inf.god);

}

printf("Введите количество экземпляров книги:&bsol;n");

scanf("%d",&x->inf.kol);

while(x->inf.kol<0)

{

printf("Количество книг не может быть отрицательным числом! Введите повторно!&bsol;n");

scanf("%d",&x->inf.kol);

}

x2->inf=x->inf; //копирование информационных полей

x2->inf.kol=0; //в начале количество выданных книг-0

printf("Новый элемент добавлен!&bsol;n");

x->next=NULL; //обнуление указателя на следующий элемент добавляемого элемента

cur->next=x; //последний (пока что последний)элемент списка указывает на следующий элемент (добавляемый)

x->pred=cur; //указатель на предыдущий элемент нового элемента равен последнему

cur=x; //теперь добавленный элемент-последний

x2->next=NULL; //аналогично для второго списка

cur2->next=x2;

x2->pred=cur2;

cur2=x2;

}

}

//---------------------------------------------------------------------&bsol;

void delel(el **top,el **top2) //удаление элементов

{

el *cur=*top,*cur2=*top2; //текущие указатели списков равны указателям на вершины списков

intn=0; //результат поиска

charisk[20]; //фамилия искомого автора

clrscr();

if(cur==NULL) printf("Перед тем, как удалять элементы из списка, создайте его!&bsol;n");

else

{

printf("Введите фамилию автора, книги которого должны быть удалены:&bsol;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();

}

//---------------------------------------------------------------------&bsol;

voidvozvrat(el *cur,el *cur2) //возвращение элемента

{

char iskA[10],iskN[10];

int n=0;

clrscr();

if(cur==NULL) printf("Перед тем, как производить поиск в списке, необходимо его создать!");

else

{

printf("Введите интересующего Вас автора:&bsol;n");

scanf("%s",iskA);

printf("Введите интересующую Вас книгу:&bsol;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("К сожалению, ни одной такой книги не найдено!&bsol;n");

}

getch();

}

//---------------------------------------------------------------------&bsol;

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; //перестановки есть

}

}

}

}

//---------------------------------------------------------------------&bsol;

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();

}

//---------------------------------------------------------------------&bsol;

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();

}

//---------------------------------------------------------------------&bsol;

voidmain() //основная программа

{

int n=0;

el *top=NULL,*top2=NULL;

while(n!=11)

{

clrscr();

printf("Введите номер пункта для выполнения:&bsol;n");

printf("1.Заполнить список&bsol;n");

printf("2.Загрузить списки из файлов&bsol;n");

printf("3.Отсортировать текущий список&bsol;n");

printf("4.Вывести текущий список&bsol;n");

printf("5.Вывести текущий список выданных на руки книг&bsol;n");

printf("6.Добавить новый элемент&bsol;n");

printf("7.Удалить из списка книги заданного автора&bsol;n");

printf("8.Выдать книгу на руки&bsol;n");

printf("9.Вернуть книгу в библиотеку&bsol;n");

printf("10.Сохранить списки в файл&bsol;n");

printf("11.Выход из программы&bsol;n");

printf("Ваш выбор:&bsol;n");

scanf("%d",&n);

while(n>11||n<1)

{

printf("Такого пункта нет! Введите повторно:&bsol;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);

}

}


Приложение Б

Результаты работы программы