Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2013, 16:36   #1
FleXt
Пользователь
 
Регистрация: 01.12.2012
Сообщений: 28
По умолчанию двусвязный список

В общем нужно удалить элементы у которых равные соседи, последний и первый элементы являются соседями. Не работает как раз удаление в случае когда первый и последний элементы равны
Цитата:
void delete(element* ch)
{
element* head = ch, *sh;
do
{ sh = ch->next;
if (ch->prev->data == ch->next->data) {
ch->next->prev = ch->prev;
ch->prev->next = ch->next;
delete ch;
}
ch = sh;
} while (ch != head);
ch = head;

}

Последний раз редактировалось FleXt; 16.02.2013 в 17:44.
FleXt вне форума Ответить с цитированием
Старый 16.02.2013, 17:35   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Заведи переменку хвоста. Тогда:
Код:
if(head->data==tail->data){
 element* t=tail->prev;
 tail->prev=0;
 free(tail);
 tail=t;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.02.2013, 17:47   #3
FleXt
Пользователь
 
Регистрация: 01.12.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Заведи переменку хвоста. Тогда:
Код:
if(head->data==tail->data){
 element* t=tail->prev;
 tail->prev=0;
 free(tail);
 tail=t;
}
Цитата:
void deleteChars(element* ch)
{
element* head = ch, *sh;
do
{ sh = ch->next;
if (ch->prev->data == ch->next->data) {
ch->next->prev = ch->prev;
ch->prev->next = ch->next;
delete ch;
}
ch = sh;
} while (ch != head);
ch = head;
element* tail=ch->prev;
if(head->data==tail->data){
element* t=tail->prev;
tail->prev=0;
free(tail);
tail=t;
}


}
все равно конец не удаляется
FleXt вне форума Ответить с цитированием
Старый 16.02.2013, 17:51   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
element* tail=ch->prev;
Когда я говорил "хвост" я имел ввиду глобальную переменную, хранящую указатель на последний элемент и не это.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.02.2013, 17:54   #5
FleXt
Пользователь
 
Регистрация: 01.12.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Когда я говорил "хвост" я имел ввиду глобальную переменную, хранящую указатель на последний элемент и не это.
поясните пожалуйста, что у меня не так, кроме того, что она не глобальная
FleXt вне форума Ответить с цитированием
Старый 16.02.2013, 18:05   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да я бы сказал что все не так. Начиная с постановки задачи.
Есть список: 1 2 3 4 5
Какой сосед у 2?
Или речь идет о вышвыривании повторяющихся элементов из списка?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.02.2013, 18:19   #7
FleXt
Пользователь
 
Регистрация: 01.12.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да я бы сказал что все не так. Начиная с постановки задачи.
Есть список: 1 2 3 4 5
Какой сосед у 2?
Или речь идет о вышвыривании повторяющихся элементов из списка?
у двойки соседи 1 и 3, но тк они не равны, то удалять ее не надо. Пример LOLK после удаления LL
FleXt вне форума Ответить с цитированием
Старый 16.02.2013, 19:12   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ага. Тогда я бы писал так:
Код:
void deleteChars(element* ch)
{
element* head,tail;

for(ch=head;ch;){
 tail=ch;
 if (ch->prev->data == ch->next->data) {
  ch->next->prev = ch->prev;
  ch->prev->next = ch->next;
  delete ch;
 } else {ch=ch->next;} 
}

 if (head->data == tail->data) {
  head->prev=tail->prev;
  tail->prev->next=head;
  delete tail;
 };
}


}
Т.е. после удаления не производить переход на следующий элемент. Поскольку уже после удаления сам список изменился.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.02.2013, 19:14   #9
FleXt
Пользователь
 
Регистрация: 01.12.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ага. Тогда я бы писал так:
Код:
void deleteChars(element* ch)
{
element* head,tail;

for(ch=head;ch;){
 tail=ch; // вот тут ошибка 
 if (ch->prev->data == ch->next->data) {
  ch->next->prev = ch->prev;
  ch->prev->next = ch->next;
  delete ch;
 } else {ch=ch->next;} 
}

 if (head->data == tail->data) {
  head->prev=tail->prev;
  tail->prev->next=head;
  delete tail;
 };
}


}
Т.е. после удаления не производить переход на следующий элемент. Поскольку уже после удаления сам список изменился.
выдало ошибку в строчке " tail=ch;"

Последний раз редактировалось FleXt; 16.02.2013 в 19:28.
FleXt вне форума Ответить с цитированием
Старый 16.02.2013, 19:31   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
выдало ошибку
Побежал за телепатором....
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязный список в C++. ЕвгенийЕрмак Помощь студентам 0 03.05.2012 20:21
Двусвязный список(C++) fable0097 Помощь студентам 0 16.05.2011 16:03
Двусвязный список decantnik Паскаль, Turbo Pascal, PascalABC.NET 0 09.05.2011 00:58
двусвязный список Olezhka Помощь студентам 1 23.03.2011 11:00
двусвязный список klykovka Помощь студентам 8 22.05.2010 18:58