Представление каталога книг в виде двунаправленного списка

Каталог книг, содержащихся в библиотеке, представлен в виде двунаправленного списка. Написать программу, обрабатывающую такой каталог (включение, исключение книг, поиск нужной книги). Задание № 7 (Двунаправленные списки) (см. "Сборник задач для начинающего программиста").

Алгоритм:
1) Создаем три функции: include ("включение"),Delete("удаление"),search("поиск")
2) Создаем бесконечный цикл, где пользователь может вызывать функции сколько угодно раз
3) Функция "включение":
создаем готовый элемент списка, соединяя его с остальными элементами списка
4) Функция "удаление":
удаляем элемент списка в зависимости от его месторасположения (в начале, конце или между элементами)
5) Функция "поиск":
ищем необходимый элемент,"пробегая" по всему списку.

#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; // возращаем  строку "Такая книга отсутствует"
}

Ключевые слова: 
структура, двунаправленные списки, удаление элемента, поиск
ВложениеРазмер
dv_spiski.rar10.75 кб