| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Сорт списк |
| Автор: apook 2.7.2007, 04:51 | ||||
| Не могу догнать устройство сортировки списка Если с массивом все ясно
а со списком какая-то муть, если делать
нифига неправильно, там вроде какая то путанница с List[ i ]->next; Даже если этот код проходит то ничего не меняет? уже бошка заклинила... |
| Автор: zkv 2.7.2007, 05:33 | ||
технически все правильно будет (если перегруженный оператор [] дает ссылку на данные, а для типа данных перегружен оператор =). Но когда речь идет о списке обычно перемещение осуществляется перенацеливанием указателей. Хотя обмен данными может работать быстрее в некоторых случаях. Несомненное преимущество в быстродействии перед контейнерами в которых данные идут "сплошняком" список имеет при частых вставках(удалениях) данных в(из) середину(ы). В случае сортировки, список должен давать преимущество, если размер данных достаточно велик, и дешевле перекинуть указатели, чем обменивать данные (но это мои догадки). Что я подразумевал под перенацеливанием указателей:
|
| Автор: apook 2.7.2007, 06:17 | ||||||
У меня структура такая
указатели на начало и конец отдельно
допустим вот даже поменять местами start и end? У меня даже не получается даные поменять прога доходит до этого меса и ошибка. Я сравниваю:
ну а что же с указателем внутри структуры допустим end->next теперь указывает на второй элемент списка , пробовал их там тоже менять но запутался че-то |
| Автор: Sartorius 2.7.2007, 07:06 | ||||||
ЗЫ что за ошибка? PPS списки сортируют слиянием(по Нейману) |
| Автор: apook 2.7.2007, 07:38 | ||
Ну что нетак?
Туплю конкретно |
| Автор: zkv 2.7.2007, 08:19 | ||
на компиляторе не проверял, вроде должно работать, если в конце ничего не затупил (что возможно)
|
| Автор: apook 2.7.2007, 09:14 |
| zkv сейчас проверю твой код но я выяснил что в теле функции меняет а на самом деле все остается на своих местах |
| Автор: apook 2.7.2007, 09:43 | ||
| 2zkv твоя функция приводит к точно такому же исключению что и моя Вот весь листинг тестирующий список набросал, все хорошл если бы не сорт
Ошибка однако в функции Swap на разных компиляторах пробовал что то точно не то ну на tсс разве что прога доходит до конца но толку тож нету. |
| Автор: apook 3.7.2007, 02:15 |
| В функции Swap перенацеливанием указателей происходит, но после выхода из нее выясняется что все осталось на своих местах, неохото memcpy использовать ведь так должно работать по идее... |
| Автор: KelTron 3.7.2007, 07:02 | ||||
Тебе же Sartorius написал:
Поэтому надо делать так:
Но для этого конечно же надо перегрузить оператор =. |
| Автор: apook 3.7.2007, 07:26 |
| Нее данные менять неинтересно, а перенацеливание указателей что-то не получается в данном случае можно менять данные так попроще серавно при перегрузка придется то-же делать: [code=cpp] char tmp; tmp=end->data; end->data=start->data; start->data=tmp; [/code=cpp] Я хотел именно перенацеливанием указателей... ну тогда отложим пока |
| Автор: Delite 4.7.2007, 01:02 | ||
Если требования разрешают и лень разбираться с кучей вариантов, то можно сделать, например, так:
|
| Автор: apook 4.7.2007, 01:31 |
| Это замена данных, а не перенацеливание указателей |