Поиск в файле слов, являющихся палиндромами.

Дан файл, содержащий некоторое количество слов. Вывести слова, являющиеся палиндромами (одинаково читается как сле­ва направо, так и справа налево). Задание 4("Двунаправленные списки"). (см. "Сборник задач для начинающего программиста")

Алгоритм:
1. Читаем файл, записываем слово в двунаправленные список.
2. Идем по списку от начала, сравнивая первый элемент с последним, второй с предпоследним и так далее. Если элементы не совпдают, то слово не является палиндромом.
3. Выводим палиндромы на экран.

#include <iostream>
#include <fstream> // подключаем заголовок для работы с файлом
 
using namespace std;
 
 
 
 
 
// структура "Двунаправленный список"
 
struct dlList
{
 
	dlList *prev;
        char c;
        dlList *next;
 
} *start, *last;
 
 
 
void readFile(const char *name); // читает файл, записывает слово в двунаправленный спиок и вызывает функцию печати файла.
 
bool check_palindrome(void); // проверяет слово на условие палиндрома
 
void print_palindrome(void); // вывод палиндрома на экран
 
 
 
int main()
 
{	
 
	start = NULL;
 
	const char *name = "data1"; // Имя файла, который будем читать
 
	readFile(name);
 
	return 0;
 
}
 
 
 
void readFile(const char *name)
 
{
 
	char ch = ' ';
 
	dlList *p, *p1;
 
	ifstream in(name); 
 
	// Если файла с именем name не существует
 
	if(!in) 
        {
 
		cout << "The file \"" << name << "\" cannot be opened.\n";
	}
 
 
 
    	while(in)
	{
 
		while(ch != '\n' && !in.eof())
		{
 
      			in.get(ch); // Считываем символ из файла
 
 
			if(ch >= 65 && ch <=90 || ch >= 97 && ch <= 122)
 
			{
 
				if(ch >= 65 && ch <= 90)
 
				   ch = ch - 'A' + 'a';
 
				if(start == NULL)
 
				{
 
					start = new dlList;
 
					start -> c = ch;
 
					start -> next = NULL;
 
					start -> prev = NULL;
 
					last = start;
 
				}
 
				else 
 
				{
 
					p = new dlList;
 
					p -> c = ch;
 
					p -> next = NULL;
 
					p -> prev = last;
 
					last -> next = p;
 
					last = p;
 
				}
 
 
 
			}
 
		}
 
		// Если палиндром, то печатаем его
 
		if(check_palindrome())
 
		{
 
			print_palindrome();
 
		}
 
 
 
		p = start;
 
 
 
		while(p != NULL)
 
		{
 
			p1 = p -> next;
 
			delete p;
 
			p = p1;
 
 
 
		}
 
 
 
		start = NULL;
 
		last = NULL;
 
 
 
		ch = ' ';
 
 
 
	}
 
 
 
	in.close();
 
 
 
 
 
}
 
bool check_palindrome(void)
 
{
 
	dlList *start1, *last1;
 
 
 
	start1 = start;
 
	last1 = last;
 
 
 
	while (start1 != last1)
 
	{
 
		if ( (start1 -> c) != (last1 -> c) ) break;
 
		else
 
		{
 
			start1 = start1 -> next;
 
			last1 = last1 -> prev;
 
		}	
 
	}
 
	if (start1 == last1) return true;
 
	else 
 
		return false;
 
}
 
 
 
void print_palindrome(void)
 
{
 
	dlList *p;
 
	p = start;
 
	while(p != NULL)
 
	{
 
		cout << p -> c;
 
		p = p -> next;
 
	}
 
	cout << endl;
 
}

Ключевые слова: 
Двунаправленный список, палиндромы, файл чтение
ВложениеРазмер
double-linked_list_4.zip89.21 кб