Отсортировать по алфавиту односвязный список
Здавствуйте. В общем мне нужно отсортировать список по анлийскому алфавиту, то есть например у нас есть вот такие две строки:
Но нужно, чтобы строка с буквой А была раньше B. Увы не знаю, как это сделать, подскажите, пожалуйста. Вот пример моей функции:
void sort(struct spis **Begin) {
struct spis* Current = *Begin, *Previous = Current;
int m;
while (Current) {
if (strcmp(Current->name,Current->Next->name)>0) {
Previous = Current;
Current = Current->Next;
}
else
{
Current->Next=Current;
Current = Previous->Next;
}
}
}
Структура такая:
struct spis {
char name[45];
float sc;
float cnt;
double sq;
struct spis *Next;
};
Вот моя функция заполнения списка:
struct spis* CreateList(void)
{
struct spis* Begin = NULL, *Previous = NULL,*Current = NULL;
double sqx;
int i=0;
int size=1;
char Ok = 'y';
while (Ok=='y')
{
Current =(struct spis*)malloc(sizeof(struct spis));
if (Begin == NULL)
Begin = Current;
else Previous->Next = Current;
Previous = Current;
for (i; i < size; i++) {
printf("%d. Введите: название, школу, количество, площадь >", i + 1);
scanf("%s", &Current->name);
scanf_s("%f", &Current->sc);
scanf_s("%f", &Current->cnt);
scanf_s("%lf", &sqx); Current->sq = sqx;
}
fflush(stdin);
printf("\nContinue? (Y/N):");
Ok = _getch(); cout << endl;
size++;
}
Previous->Next = NULL;
return Begin;
}
Ответы (1 шт):
Вот пара простых функций (на основе вашей структуры односвязного списка, в принципе, их можно обобщить для произвольной структуры, добавив в аргументы вызова функции пользователя для доступа к Next и сравнения).
Вставка в сортированный список (возможно пустой, возможно из одного элемента)
struct spis *
insert_srt (struct spis *list, struct spis *item)
{
if (!list || strcmp(item->name, list->name) < 0) {
item->Next = list;
list = item;
} else {
for (struct spis *p = list; p; p = p->Next)
if (p->Next == 0 || strcmp(item->name, p->Next->name) < 0) {
item->Next = p->Next;
p->Next = item;
break;
}
}
return list;
}
Сортировка списка
struct spis *
sort_list (struct spis *list)
{
struct spis *sl = 0;
while (list) {
struct spis *p = list;
list = list->Next;
sl = insert_srt(sl, p);
}
return sl;
}
Надеюсь, с вводом начального списка и вызовом sort_list() вы справитесь сами.
Update 1
Попробовал с вашей функцией
void
print_list (struct spis *p)
{
while (p) {
printf("%s %f %f %f\n", p->name, p->sc, p->cnt, p->sq);
p = p->Next;
}
}
struct spis* CreateList(void)
{
struct spis* Begin = NULL, *Previous = NULL,*Current = NULL;
double sqx;
int i=0;
int size=1;
char Ok = 'y';
while (Ok=='y')
{
Current =(struct spis*)malloc(sizeof(struct spis));
if (Begin == NULL)
Begin = Current;
else Previous->Next = Current;
Previous = Current;
// for (i; i < size; i++) {
printf("%d. Введите: название, школу, количество, площадь >", size);
scanf("%s", Current->name);
scanf("%f", &Current->sc);
scanf("%f", &Current->cnt);
scanf("%lf", &sqx); Current->sq = sqx;
// }
fflush(stdin);
printf("\nContinue? (Y/N):");
char buf[100];
scanf("%s", buf);
Ok = buf[0];
//Ok = getchar();
// cout << endl;
puts("");
size++;
}
Previous->Next = NULL;
return Begin;
}
int
main (int ac, char *av[])
{
struct spis *list = CreateList();
puts("-----");
list = sort_list(list);
print_list(list);
return puts("End") == EOF;
}
Оттранслировал и запустил
avp@avp-desktop:~/avp/hashcode$ gcc -g list_insert_sort.c
avp@avp-desktop:~/avp/hashcode$ ./a.out
1. Введите: название, школу, количество, площадь >m 1 2 3
Continue? (Y/N):y
2. Введите: название, школу, количество, площадь >a 2 3 4
Continue? (Y/N):y
3. Введите: название, школу, количество, площадь >z 7 6 4
Continue? (Y/N):y
4. Введите: название, школу, количество, площадь >b 6 4 3
Continue? (Y/N):n
-----
a 2.000000 3.000000 4.000000
b 6.000000 4.000000 3.000000
m 1.000000 2.000000 3.000000
z 7.000000 6.000000 4.000000
End
avp@avp-desktop:~/avp/hashcode$
У меня вроде сортирует?
