Консультация # 190338: Здравствуйте! Прошу помощи в следующем вопросе: Подготовить текстовый файл, содержащий не менее 10 слов. Прочитать данные из этого файла и сформировать двусвязный список, элементы которого имеют тип STRING. Написать программу, подсчитывающую количество элементов списка, которые начинаются и оканчиваются одним и тем же символом. После заве...Консультация # 190340: Оператор FOR. напишите программу плес. Вывести «столбиком» следующие числа: 2,1, 2,2, 2,3, ..., 2,8....
Подготовить текстовый файл, содержащий не менее 10 слов. Прочитать данные из этого файла и сформировать двусвязный список, элементы которого имеют тип STRING. Написать программу, подсчитывающую количество элементов списка, которые начинаются и оканчиваются одним и тем же символом. После завершения работы со списками освободить занимаемую ими динамическую память.
Буду благодарна, если код будет написан на Си. Я смогла написать только
основные функции работы с двусвязным и списком и не уверена, что и они верны. Заранее спасибо за помощь!
Здравствуйте, Usagisan! 1) Вы говорите о С, а сами используете элементы C++, такие как new, cin , cout 2) Полем данных должна быть строка, а не double 3) Должен быть двунаправленный список, т.е. должны быть и голова, и хвост 3) Надо читать с файла, а не с консоли Посмотрите, как я сделал (на чистом С):
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct ListNode1
{
char* info; //указатель на строку
ListNode1* next; //указатель на следующий элемент
ListNode1* prev; //указатель на предыдущий элемент
}ListNode1;
//указатели на голову и хвост определим в глобальной памяти
ListNode1* pHead = NULL;
ListNode1* pTail = NULL;
//параметром укажем только значение поля info
void AddToList(char * info)
{
ListNode1* q = (ListNode1*) malloc(sizeof(ListNode1)); //выделим память под узел
q->info = (char*)malloc(strlen(info)+1); //и под строку
strcpy(q->info, info); //копируем строку
q->next = NULL; //узел всегда будет последним
if (pTail) //указатель хвоста непуст?
{
q->prev = pTail; //для нового предыдущим станет старый хвост
pTail->next = q; //для бывшего хвоста следующим - новый
}
else
{ //новый - единственный, будет и головой, и хвостом
q->prev = NULL; //для головы предыдущего нет
pHead = q; //голова списка - новый узел
}
pTail = q; //новый становится новым хвостом
}
//параметром укажем имя файла
int FormList1(char *fName)
{
char string[1024]; //буфер для чтения
FILE *fp = fopen(fName, "r") ; //открываем файл на чтение
if (fp) //открылся?
{
while (-1 != fscanf(fp, "%s", string)) //читаем, пока читается
{
AddToList(string); //и включаем очередную строку в список
}
fclose(fp); //закрываем файл
return true; //файл считан
}
return false; //ошибка, скорее всего, файл не найден
}
//подсчитываем слова, у которых одинаковые первая и последняя буквы
int GetCount(void)
{
int count = 0;
ListNode1 * node;
for(node=pHead; node; node=node->next) //по всем узлам
//сравниваем буквы, если равны, получим 1, иначе 0
count += (node->info[0] == node->info[strlen(node->info)-1]);
return count; //возвращаем счетчик
}
void DelList() //освобождаем память списка
{ //воспользуемся указателями pHead и pTail, все равно они уже не нужны
while(pHead) //пока что-то есть
{
pTail = pHead->next; //сохраним адрес следующего
free(pHead->info); //сначала освободим память строки
free(pHead); //потом память самого узла
pHead = pTail; //адрес следующего
}
}
int main()
{
if (FormList1("test.txt")) //формируем список из файла
{
printf("Count = %d\n", GetCount()); //выводим количество слов с одинаковыми первой и последней буквой
DelList(); //освобождаем память
}
else
printf ("File 'test.txt' not found!\n"); //файл не найден
return 0;
}
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!