Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 373
∙ повысить рейтинг »
Степанов Иван /REDDS
Статус: 3-й класс
Рейтинг: 154
∙ повысить рейтинг »
CradleA
Статус: Профессионал
Рейтинг: 45
∙ повысить рейтинг »

∙ С / С++

Номер выпуска:1887
Дата выхода:02.12.2016, 13:15
Администратор рассылки:Андрей Кузнецов aka Dr_Andrew (Старший модератор)
Подписчиков / экспертов:23 / 16
Вопросов / ответов:1 / 1

Консультация # 190175: Здравствуйте! Дана следующая задача: Нужно подготовить текстовый файл. Прочитать данные из этого файла и сформировать двусвязный список. Написать программу, подсчитывающую количество элементов списка, которые начинаются с того же символа, что и следующий элемент списка. После завершения работы со списками освободить занимаемую ими динамичес...

Консультация # 190175:

Здравствуйте! Дана следующая задача:

Нужно подготовить текстовый файл. Прочитать данные из этого файла и сформировать двусвязный список. Написать программу, подсчитывающую количество элементов списка, которые начинаются с того же символа, что и следующий элемент списка. После завершения работы со списками освободить занимаемую ими динамическую память. К сожалению, не могу провести подсчет этих самых элементов . smile Вот что у меня пока получилось:

Дата отправки: 27.11.2016, 13:13
Вопрос задал: user8351 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, user8351!
Можно сделать, например, так:

/*Нужно подготовить текстовый файл. 
  Прочитать данные из этого файла и сформировать двусвязный список. 
  Написать программу, подсчитывающую количество элементов списка, 
  которые начинаются с того же символа, что и следующий элемент списка. 
  После завершения работы со списками освободить занимаемую ими динамическую память
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <iomanip>
#include <iostream>
#include <cstdlib>

using namespace std;

struct Node	  ///Структура являющаяся звеном списка
{
	char x;	///Значение x будет передаваться в список
	Node *Next,*Prev; ///Указатели на адреса следующего и предыдущего элементов списка
};

class List	///Создаем тип данных Список
{
	Node *Head,*Tail; ///Указатели на адреса начала списка и его конца
public:
	List():Head(NULL),Tail(NULL){}; ///Инициализируем адреса как пустые
	~List(); //Деструктор
	void Show(); //Функция отображения списка на экране
	void Add(char x); //Функция добавления элементов в список
	int CountEquals();
};

List::~List() //Деструктор
{
	while (Head) //Пока по адресу на начало списка что-то есть
	{
		Tail=Head->Next; //Резервная копия адреса следующего звена списка
		delete Head; //Очистка памяти от первого звена
		Head=Tail; //Смена адреса начала на адрес следующего элемента
	}
}

void List::Add(char x)
{
	Node *temp=new Node; //Выделение памяти под новый элемент структуры
	temp->Next=NULL;  //Указываем, что изначально по следующему адресу пусто
	temp->x=x;//Записываем значение в структуру

	if (Head!=NULL) //Если список не пуст
	{
		temp->Prev=Tail; //Указываем адрес на предыдущий элемент в соотв. поле
		Tail->Next=temp; //Указываем адрес следующего за хвостом элемента
		Tail=temp; //Меняем адрес хвоста
	}
	else //Если список пустой
	{
		temp->Prev=NULL; //Предыдущий элемент указывает в пустоту
		Head=Tail=temp; //Голова=Хвост=тот элемент, что сейчас добавили
	}
}

int List::CountEquals()
{
	int	k;
	Node *temp;

	for(k=0, temp=Head; temp->Next; temp=temp->Next)	//пока есть следующий
		k += (temp->x == temp->Next->x);	//добавляем результат сравнения, если равно, то будет 1
	return k;
}

void List::Show()
{
//ВЫВОДИМ СПИСОК С НАЧАЛА
	Node *temp=Head; //Временно указываем на адрес первого элемента
	while (temp!=NULL) //Пока не встретим пустое значение
	{
		cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
		temp=temp->Next; //Смена адреса на адрес следующего элемента
	}
	cout<<"\n";
 }


int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	system("CLS");
	
	List lst; //Объявляем переменную, тип которой есть список

	FILE *myfile;
	myfile = fopen ("data.txt", "r");

	if(myfile == NULL)
	{
		printf("Ошибка. Не могу открыть файл.\n");
		return 0;
	}
	else
		printf("Файл открыт.\n");

	char str[30];
	fgets(str, 29, myfile); ///считываем строку из файла

	for (int i = 0; str[i]; i++)
		lst.Add(str[i]); //Добавляем в список элементы

	lst.Show(); //Отображаем список на экране

	printf("%\nКол-во эл-ов,\nкот. начинаются с\nтого же символа, что и след.эл-т: %d\n\n",lst.CountEquals());
	system("PAUSE");
	
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 01.12.2016, 21:47
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное