Консультация № 190175
27.11.2016, 13:13
0.00 руб.
0 2 1
Здравствуйте! Дана следующая задача:

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

Приложение:
#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");

}

Обсуждение

давно
Посетитель
7438
7205
01.12.2016, 21:47
общий
это ответ
Здравствуйте, user8351!
Можно сделать, например, так:
[code h=200]
/*Нужно подготовить текстовый файл.
Прочитать данные из этого файла и сформировать двусвязный список.
Написать программу, подсчитывающую количество элементов списка,
которые начинаются с того же символа, что и следующий элемент списка.
После завершения работы со списками освободить занимаемую ими динамическую память
*/
#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");

}
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399277
11
03.12.2016, 09:51
общий
Огромное спасибо за Вашу помощь!
Форма ответа