Курсовая работа: Обработка динамических структур
tail=cur; //указатель на хвост приравнивается текущему
элементу
cur2=(el*)malloc(sizeof(el)); //выделяется память под новый элемент второго списка,
выполняются те же действия
cur2->next=NULL;
cur2->pred=tail2;
if((*top2)==NULL)
(*top2)=cur2; // *top2
это указатель на указатель
else
tail2->next=cur2;
tail2=cur2;
printf("Введите фамилию и инициалы
автора:\n"); //ввод информационных полей
scanf("%s",cur->inf.avt);
printf("Введите название книги:\n");
scanf("%s",cur->inf.nazv);
printf("Введите год издания книги:\n");
scanf("%d",&cur->inf.god);
while(cur->inf.god<0)
{
printf("Год издания не может быть
отрицательным числом! Введите повторно!\n"); //проверяется, положителен ли год
scanf("%d",&cur->inf.god); //повторный ввод
}
printf("Введите количество экземпляров
книги:\n"); //аналогичное с количеством
scanf("%d",&cur->inf.kol);
while(cur->inf.kol<0)
{
printf("Количество книг не может быть
отрицательным числом! Введите повторно!\n");
scanf("%d",&cur->inf.kol);
}
cur2->inf=cur->inf; //копировние информационных полей
элемента первого списка в элемент второго списка
cur2->inf.kol=0;
//количество выданных книг в начале равно 0
printf("Введете еще одну запись?(для
выхода напишите no; для
продолжения-yes)\n");
scanf("%s",s);
while(strcmp(strlwr(s),"no")!=0&&strcmp(strlwr(s),"yes")!=0)
//пока не введён правильный вариант
{
printf("Вы неверно ввели свой выбор,
введите, пожалуйста, его еще раз\n");
scanf("%s",s); //повторный
ввод
}
}
return top; //возвращение указателя на начало первого списка
}
//-----------------------------------------------------\\
void vivodSp(el *cur) //вывод списка
{
clrscr();
printf("Текущий список:\n");
if(cur==NULL) printf("Перед тем, как выводить
список, необходимо его создать!");
else
{
printf("Фамилия автора\tНазвание книги\tГод издания\tКоличество экземпляров\n");
while(cur!=NULL) //печать
списка пока не достигнут конец списка, если количество книг больше нуля (нужно
для второго списка)
{
if(cur->inf.kol>0)
printf(" %s\t\t\t%s\t %d\t\t\t %d\n",cur->inf.avt,cur->inf.nazv,cur->inf.god,cur->inf.kol);
cur=cur->next; //переход
к следующему элементу
}
}
getch();
}
//--------------------------------------------------------------\\
void
vidacha(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)&&cur->inf.kol>0) //если элемент содержит
сведения о нужной книге и есть свободные в наличии
{
cur->inf.kol--;
//уменьшаем количество в первом списке
cur2->inf.kol++;
//и увеличиваем во втором
n++; //поиск успешен
printf("Книга выдана на руки!");
break; //конец поиска
}
else if((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur->inf.kol==0) //если свободных нет
{
printf("Все книги находятся на
руках!");
n++; //поиск успешен
break; //конец поиска
}
cur=cur->next; //переход
к следующем элементу
}
if(n==0) printf("Такой
книги вообще нет!");
}
getch();
}
//---------------------------------------------------------------------\\
void dobEl(el *cur, el *cur2) //добавление
нового элемента
{el *x,*x2;
clrscr();
if(cur==NULL) printf("Перед тем, как добавлять
элементы в список, необходимо его создать!");
else
{
while(cur->next!=NULL)
cur=cur->next; //поиск конца списка
while(cur2->next!=NULL)
cur2=cur2->next; //аналогично со вторым
x=(el*)malloc(sizeof(el)); //выделение памяти под новый элемент
x2=(el*)malloc(sizeof(el)); //аналогичный действия для второго списка
printf("Введите данные на новый
элемент:\n"); //ввод информационных полей
printf("Введите фамилию и инициалы
автора:\n");
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; //текущие указатели списков равны указателям на
вершины списков
int n=0; //результат поиска
char isk[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);
}
else if(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();
}
//---------------------------------------------------------------------\\
void vozvrat(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;
}
else if((strcmp(cur->inf.avt,iskA)==0)&&(strcmp(cur->inf.nazv,iskN)==0)&&cur2->inf.kol<=0) //если книг на руках нет
{
printf("Все свои книги дома! Чужих нам
не надо)))");
Страницы: 1, 2, 3, 4, 5, 6 |