|
|
  |
сортировка связного списка |
|
|
|
Mar 5 2010, 04:49
|

Участник

Группа: Участник
Сообщений: 41
Регистрация: 12-10-09
Пользователь №: 52 882

|
Структура TMyRect хратит координаты прямоугольников и их площади. Указатель на структуру представляется в виде связного списка. В *R0 записываются координаты прямоугольников прочитанных из файла. *X0 по размеру одинаков с *R0, но пустой - в него и нужно записать отсортированный список *R0. Сколько не пытался - ну никак не получается. Отсортировать нужно по параметру S(площадь). Код struct TMyRect { int x1,y1,x2,y2; int S; TMyRect *point; //point=next }; TMyRect *R0 = NULL, *Rnew, *Rold, *tmp;//несортированный список TMyRect *X0 = NULL, *Xnew, *Xold;//сортированный список
void sortirovka () { //сортировка Rnew=R0; Xnew=X0;
while (Rnew!=NULL) { for (Xnew=X0;Xnew->point!=0;Xnew=Xnew->point) { if (Rnew->point->S > Rnew->S) break; } Rnew->point=Xnew->point; Xnew->point=Rnew;
Rnew=Rnew->point; } //конец сортировки }
Сообщение отредактировал rezident - Mar 5 2010, 04:59
Причина редактирования: Оформление цитаты исходника.
--------------------
coding, кодинг, koDinГ, copyriting, printing ....
|
|
|
|
|
Mar 5 2010, 06:42
|

Участник

Группа: Участник
Сообщений: 41
Регистрация: 12-10-09
Пользователь №: 52 882

|
Цитата(AHTOXA @ Mar 5 2010, 11:16)  Код void sortirovka () { Rnew=R0; Xnew=X0; // --- заменить вот это X0 = R0; // --- на вот это. А то X0 как был 0, так и остаётся. ... } программа подвисает
--------------------
coding, кодинг, koDinГ, copyriting, printing ....
|
|
|
|
|
Mar 5 2010, 10:51
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Sneg_87 @ Mar 5 2010, 11:42)  программа подвисает Хм. Там оказывается весьма нетривиально всё. Прежде чем добавлять элемент в сортированный список, его нужно изъять из несортированного. И не забыть изначально добавить 0 в конец сортированного списка. Короче, вот тестовая программа: CODE #include <stdio.h> #include <stdint.h>
struct point { int x1; point *next; };
point *unsorted; point *sorted;
point p1 = {68}; point p2 = {3}; point p3 = {4}; point p4 = {8}; point p5 = {10}; point p6 = {12}; point p7 = {43}; point p8 = {6}; point p9 = {58};
void print_points(char * name, point * arr) { printf("%s : ", name); while (arr) { printf("%d, ",arr->x1); arr = arr->next; } }
void fillpoints() { unsorted = &p1; p1.next = &p2; p2.next = &p3; p3.next = &p4; p4.next = &p5; p5.next = &p6; p6.next = &p7; p7.next = &p8; p8.next = &p9; p9.next = 0; }
void sort_points() { point * run; point * tmp; point * nxt;
// присваиваем начальное значение сортированному списку. sorted = unsorted;
// изымаем этот элемент из несортированного списка run = unsorted->next;
// не забываем терминатор для сортированного списка sorted->next = 0;
// перебираем несортированный список, начиная со второго элемента: while (run) { // запоминаем следующий элемент, потому что мы испортим его при вставке: nxt = run->next;
// для первого элемента сортированного массива - особая проверка: if (run->x1 < sorted->x1) { // если run меньше чем первый элемент сортированного списка, // то вставляем его в начало списка, и не забываем // переназначить переменную sorted: run->next = sorted; sorted = run; run = nxt; continue; }
// теперь пробегаемся по сортированному массиву // до первого элемента, следующий за которым больше чем run: for (tmp = sorted; tmp->next; tmp = tmp->next) if (tmp->next->x1 > run->x1) break;
// и вставляем run следом за tmp: run->next = tmp->next; tmp->next = run; run = nxt; } }
int main(void) { fillpoints();
print_points("unsorted", unsorted);
sort_points();
print_points("sorted", sorted); }
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 7 2010, 05:05
|

Участник

Группа: Участник
Сообщений: 41
Регистрация: 12-10-09
Пользователь №: 52 882

|
Спасибо, AHTOXA, за ответы! Меня интересует еще такой вопрос: создается список указателей на структуру (Rnew = new TMyRect). как вернуться к указателю на первый элемент,когда нет указателя на начало?
--------------------
coding, кодинг, koDinГ, copyriting, printing ....
|
|
|
|
|
Mar 7 2010, 06:52
|

Участник

Группа: Участник
Сообщений: 41
Регистрация: 12-10-09
Пользователь №: 52 882

|
Ситуация такая получается, что в Borlande dos'овском вывод значений списка начинается с начала, хоть его и нет. То есть указатель на сортированный список это поидее порвый элемент списка. Ну а Bilder'e мне выходит последний элемент списка, а откат на первое значение получается никак нельзя сделать >_<
--------------------
coding, кодинг, koDinГ, copyriting, printing ....
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|