Каталог книг, содержащихся в библиотеке, представлен в виде двунаправленного списка. Написать программу, обрабатывающую такой каталог (включение, исключение книг, поиск нужной книги). Задание № 7 (Двунаправленные списки) (см. "Сборник задач для начинающего программиста"). Алгоритм: #include <stdio.h> #include <string.h> #include <stdlib.h> struct Titem { // создаем структуру данных char c[30]; // здесь хранится название книги Titem *prev; // это указатель на предыдущий элемент в списке Titem *next; // это указатель на следующий элемент в списке }*start,*last,*p,*p_del; void inlcude ( char *s ); // функция включения книги в список void Delete ( char* s ); // функция удаления данной книги char* search ( char *s ); // функция поиска книги int main ( ) { char com[8]; // инициализируем переменные char s[50]; start = NULL; last = NULL; while(1) // создаем бесконечный цикл, в котором пользователь вводит необходимые команды { printf ("Enter your command: "); // просим ввести команду scanf("%s", com ); if(strstr( com, "include") ) // проверяем, совпадает ли команда с ведденой пользователем { printf ("Enter the name of book: "); scanf ("%s", s ); inlcude (s); // если команда совпадает, то вызываем функцию // печатаем полученный список p = start; while(p != NULL) { printf ("%s ", p -> c); p = p -> next; } } if(strstr( com, "Delete") ) // проверяем, совпадает ли команда с ведденой пользователем { printf ("Enter the name of book: "); scanf ("%s", s ); Delete (s); // если команда совпадает, то вызываем функцию } if(strstr( com, "search") ) // проверяем, совпадает ли команда с ведденой пользователем { printf ("Enter the name of book: "); scanf ("%s", s ); printf (" %s ", search (s) ); // если команда совпадает, то вызываем функцию } if(strstr( com, "exit") ) // выход из бесконечного цикла { printf("\nBye\n"); break; } } return 0; } void inlcude ( char *s ) { if ( start == NULL ) // если элемент является первым в списке { start = new Titem; // создаем новый элемент strcpy( start -> c , s); // заносим в него название книги start -> prev = NULL; start -> next = NULL; last = start; } else { // если элемент не является первым в списке p = new Titem; // создаем новый элемент strcpy( p -> c , s); // заносим в него название книги p -> next = NULL; // адресс на следующий элемент ставим в NULL, так как след. элемента нет p -> prev = last; // соединяем вновь созданным элемент с предыдущим last -> next = p; // соединяем предыдущий элемент с вновь созданным last = p; } } void Delete ( char* s ) { p = start; p_del = start; if ( p == NULL ) // если элементов в списке нет printf (" There are no books at all \n"); // печатаем "Книг вообще нет" while (p != NULL) // создаем цикл, который пробегает по всему списку { if (strstr( s, p -> c) ) // если книга является той, которую запросил пользователь { if ( p == start ) // если данная книга - это первый элемент в списке { if ( start -> next == NULL ) // если это один элемент { last -> prev = NULL; delete p; // удаляем элемент start = NULL; printf (" Tne book was deleted \n"); // печатаем "Книга была удалена" break; // прерываем работу функции } start = start -> next; // указатель "start" присваиваем следующему элементу start -> prev = NULL; // удаляем ссылку на предыдущий элемент вновь присвоенного элемента "start" p_del -> next = NULL; // удаляем ссылку предущего элемента на элемент "start" delete p_del; // удаляем сам элемент printf (" Tne book was deleted \n"); break; // прерываем работу функции } if ( p == last ) // если элемент является последним в списке { p_del = last; last = last -> prev; // теперь "last" - это предыдущий элемент last -> next = NULL; // обрываем связь с последним элементом p_del -> prev = NULL; delete p_del; // удаляем элемент printf (" Tne book was deleted \n"); break; } // если элемент находится между другими элементами p = p -> next; // указатель "р" присваиваем следующему элементу p_del = p -> prev; ( p_del -> prev ) -> next = p_del -> next; // теперь предыдущий элемент ссылается на следующий за рассматриваемым ( p_del -> next ) -> prev = p_del -> prev; // теперь следующий элемент ссылается на предыдущий за рассматриваемым delete p_del; // удаляем элемент printf (" Tne book was deleted \n"); } else { p = p -> next; } } } char* search ( char *s ) { p = start; if (p == NULL) // если в списке вовсе нет элементов { s = " There are no books at all \n"; return s; // возвращаем строку "Вовсе нет книг" } while (p != NULL) { if ( strstr( s, p -> c) ) // если название книги совпадает с рассматриваемой { return (p -> c); // возвращаем название это книги } p = p -> next; } s = "Such book is absent ! \n"; // если данная книга отсутствует return s; // возращаем строку "Такая книга отсутствует" }
Ключевые слова:
структура, двунаправленные списки, удаление элемента, поиск
|
|||||||