Консультация # 190175: Здравствуйте! Дана следующая задача: Нужно подготовить текстовый файл. Прочитать данные из этого файла и сформировать двусвязный список. Написать программу, подсчитывающую количество элементов списка, которые начинаются с того же символа, что и следующий элемент списка. После завершения работы со списками освободить занимаемую ими динамичес...
Нужно подготовить текстовый файл. Прочитать данные из этого файла и сформировать двусвязный список. Написать программу, подсчитывающую количество элементов списка, которые начинаются с того же символа, что и следующий элемент списка. После завершения работы со списками освободить занимаемую ими динамическую память. К сожалению, не могу провести подсчет этих самых элементов . Вот что у меня пока получилось:
/*Нужно подготовить текстовый файл.
Прочитать данные из этого файла и сформировать двусвязный список.
Написать программу, подсчитывающую количество элементов списка,
которые начинаются с того же символа, что и следующий элемент списка.
После завершения работы со списками освободить занимаемую ими динамическую память
*/
#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
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!