Здравствуйте! Дана следующая задача:
Нужно подготовить текстовый файл. Прочитать данные из этого файла и сформировать двусвязный список. Написать программу, подсчитывающую количество элементов списка, которые начинаются с того же символа, что и следующий элемент списка. После завершения работы со списками освободить занимаемую ими динамическую память. К сожалению, не могу провести подсчет этих самых элементов .
Вот что у меня пока получилось:
Приложение:
#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); //Функция добавления элементов в список
};
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; //Голова=Хвост=тот элемент, что сейчас добавили
}
}
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(); //Отображаем список на экране
int k=0;
//...
printf("%\nКол-во эл-ов,\nкот. начинаются с\nтого же символа, что и след.эл-т: %d\n\n",k);
system("PAUSE");
}