Перво-наперво, у вас возникла проблема переполнения буфера:
char userChoice;
:
scanf("%s", &userChoice);
Что scanf
будет записывать два байта при вводе одного символа (символа плюс нулевой терминатор).Это повредило имя первой записи телефонной книги в моей среде, но, поскольку это неопределенное поведение, оно может сделать что угодно!
Вы можете обойти это, используя:
char userChoice[] = "something that's not Q";
:
scanf("%s", userChoice);
:
if (*userChoice == 'A') // for all of these.
Это не остановит переполнение буфера, если вы введете достаточно текста, но будет, если вы ограничитесь односимвольными командами.Если вам нужна действительно надежная функция пользовательского ввода, см. здесь .
Теперь к вашей конкретной проблеме.Похоже, у вас там что-то вроде пузыря, но ваша логика немного не в порядке.Предполагая, что вы не хотите использовать qsort
(что было бы лучшим способом для реального кода), вам просто нужно исправить пару вещей.
Ваш внешний цикл в порядке, как и ваш внутреннийцикл, но внутреннее тело цикла должно сравнивать элементы j
и j+1
, а не j
и i
.Это объясняется тем, что он работает путем замены смежных элементов, если они не в порядке.
Кроме того, направленная вперед направленная пузырьковая сортировка поместит самый высокий элемент в конец списка на первом проходе, поэтому вы не можете начать j
с i+1
на втором проходе просто потому, что элемент first может быть еще не верным.
Следующий классический псевдо-код - это ваша классическая пузырьковая сортировка:
didSwap = true
while didSwap:
didSwap = false
for i = 0 to lastidx - 1:
if array[i] > array[i+1]:
temp = array[i]
array[i] = array[i+1]
array[i+1] = temp
didSwap = true
Прочтите это, поймите, как это работает, а затем внедрите его самостоятельно.Если у вас есть проблемы с этим, я включил рабочую версию ниже:
void Sort (phone phonebook[]) {
phone temp;
int i; int didSwap;
didSwap = 1;
while (didSwap) {
didSwap = 0;
for (i = 0; i < counter - 1; i++) {
if (strcmp(phonebook[i].Surname, phonebook[i+1].Surname) > 0) {
temp=phonebook[i];
phonebook[i]=phonebook[i+1];
phonebook[i+1]=temp;
didSwap = 1;
}
}
}
}