Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двунаправленный список. Символы. 
:(
    Опции темы
DimanNSK
  Дата 8.3.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



Возникла проблема при создании двунаправленного кольцевого списка, что я делаю не так? Список заполняется вроде верно, но при доступе к предыдущему элементу, появляются проблема..

Описание самого списка:
Код

struct characters {
        char data;
        characters* next;
        characters* prev;
};


Функция реализующая заполнение списка символами из файла, до точки..
Код

characters* readList (FILE* file)
{
        characters *ch, *head;
        char c;
 
        head = new characters;
        head->prev = NULL;
        head->next = NULL;
        ch = head;
 
        while ((c = fgetc(file)) != '.')
        {       
                ch->next = new characters;
                ch->prev = ch;
                fscanf(file, "%c", &ch->data);
                ch = ch->next;
        }
 
        ch->next = head;
        ch = head;
 
        return ch;
}

PM MAIL   Вверх
mes
Дата 8.3.2010, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(DimanNSK @  8.3.2010,  08:40 Найти цитируемый пост)
при доступе к предыдущему элементу, появляются проблема..


Цитата(DimanNSK @  8.3.2010,  08:40 Найти цитируемый пост)
 
Код

    ch->next = new characters;
    ch->prev = ch;

Код

   ch->next = new characters;
   ch->next->prev = ch;

Цитата(DimanNSK @  8.3.2010,  08:40 Найти цитируемый пост)
 
Код

   ch->next = head;
   ch = head;
   return ch; 

Код

   ch->next = head;
   head->prev = ch;
   return head;


Это сообщение отредактировал(а) mes - 8.3.2010, 10:10


--------------------
PM MAIL WWW   Вверх
DimanNSK
Дата 8.3.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



mes, Спасибо, разобрался)
PM MAIL   Вверх
DimanNSK
Дата 8.3.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



mes, еще вопрос, что изменить чтобы получить кольцевой двунаправленный список. А то последний с первым и первый никак не связаны?
PM MAIL   Вверх
mes
Дата 8.3.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(DimanNSK @  8.3.2010,  09:54 Найти цитируемый пост)
А то последний с первым и первый никак не связаны? 

см. последний блок с кодом предыдущего моего поста smile



--------------------
PM MAIL WWW   Вверх
DimanNSK
Дата 8.3.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



В том то и проблема, что при выводе у первого символа предыдущего и последнего следующего выводится знак '=' 
PM MAIL   Вверх
mes
Дата 8.3.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(DimanNSK @  8.3.2010,  12:00 Найти цитируемый пост)
В том то и проблема, что при выводе у первого символа предыдущего и последнего следующего выводится знак '='  

проблема не в связаности списка, а в лишнем неинициализированном элементе, который возникает здесь :

Цитата(DimanNSK @  8.3.2010,  08:40 Найти цитируемый пост)
Код

while ((c = fgetc(file)) != '.')
{       
      ch->next = new characters;
      ch->prev = ch;
      fscanf(file, "%c", &ch->data);
      ch = ch->next;
}



Это сообщение отредактировал(а) mes - 8.3.2010, 13:43


--------------------
PM MAIL WWW   Вверх
DimanNSK
Дата 8.3.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



mes, а что конкретно следует изменить?
PM MAIL   Вверх
mes
Дата 8.3.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(DimanNSK @  8.3.2010,  12:49 Найти цитируемый пост)
mes, а что конкретно следует изменить? 

организовать функции списка (создание/добавление/..) вне функции. Иначе придется прибегать к хитростям.


--------------------
PM MAIL WWW   Вверх
DimanNSK
Дата 8.3.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



mes, О каких хитростях идет речь?
PM MAIL   Вверх
mes
Дата 8.3.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(DimanNSK @  8.3.2010,  13:29 Найти цитируемый пост)
О каких хитростях идет речь? 

Вы сейчас создаете элемент до цикла, хотя не известно нужен ли он Вам будет:
Цитата(DimanNSK @  8.3.2010,  08:40 Найти цитируемый пост)
   head = new characters;


после из за этого приходится создавать следующий, хотя опять же он может быть не нужен.
Цитата(mes @  8.3.2010,  12:42 Найти цитируемый пост)
ch->next = new characters;

в следствии у Вас лишний элемент.

Если Вы избавитесь от создания до цикла, то тогда потеряете head.

Ну так вот речь о "хитростях" позволяющих не создавать лишнего элемента и не потерять head.

Добавлено через 3 минуты и 52 секунды
вот примерный набросок - допиливайте (работоспособность не проверял)
Код

characters* readList (FILE* file)
{
        characters *last  = NULL,
                   *first = NULL;

        char c; 
        while ((c = fgetc(file)) != '.')
        {       
                characters* tmp = new characters;
                tmp->data = c;

                if (!first) 
                {
                    first =tmp;
                    first->next = tmp;
                    first->prev = tmp;                    
                }
                else if (!last)
                {
                    last = tmp;
                    last->prev  = first;
                    first->next = last;                        
                      
                }
                else 
                {
                     tmp->prev  = last;
                     last->next = tmp;

                     last = tmp;                     
                     last->next = first;     
                }
        } 
        return first;
}

P.S. хотя лучше последовать предложенному выше вариaнту :
Цитата(mes @  8.3.2010,  13:17 Найти цитируемый пост)
организовать функции списка (создание/добавление/..) вне функции.




--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.