Цитата(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);
}