Сортировка массива структур по одному из полей по алфавиту - C (СИ)
Формулировка задачи:
Вечер добрый. Нужна помощь в реализации сортировки массива структур(а точнее, одного поля массива) по алфавиту. Что имеем:
поле name как раз и нужно отсортировать. сделал что-то подобное:
но, увы, эта функция делает свое дело только после того, как её запустить несколько раз(она, походу, игнорирует то, что она запущена в цикле for )
прошу указать мне на мои ошибки и буду рад, если их мне объяснят. заранее большое спасибо.
struct book
{
char name[15];
char surname[15];
char tel[15];
} mybook[10];void Sortname(struct book *mybook, int N) // N - текущее кол-во записей в массиве
{
int i,j;
char temp[15];
for (i=1; i<N; i++)
{ tolower(mybook[i].name[j]);
if (strncmp(mybook[i].name,mybook[i+1].name,1)>0)
{ strcpy(temp,mybook[i].name);
strcpy(mybook[i].name,mybook[i+1].name);
strcpy(mybook[i+1].name,temp);
strcpy(temp,mybook[i].surname);
strcpy(mybook[i].surname,mybook[i+1].surname);
strcpy(mybook[i+1].surname,temp);
strcpy(temp,mybook[i].tel);
strcpy(mybook[i].tel,mybook[i+1].tel);
strcpy(mybook[i+1].tel,temp); break; }
else if ((strncmp(mybook[i].name,mybook[i+1].name,1)==0) && (strncmp(mybook[i].name,mybook[i+1].name,2)>0))
{ strcpy(temp,mybook[i].name);
strcpy(mybook[i].name,mybook[i+1].name);
strcpy(mybook[i+1].name,temp);
strcpy(temp,mybook[i].surname);
strcpy(mybook[i].surname,mybook[i+1].surname);
strcpy(mybook[i+1].surname,temp);
strcpy(temp,mybook[i].tel);
strcpy(mybook[i].tel,mybook[i+1].tel);
strcpy(mybook[i+1].tel,temp); break; }
}
}Решение задачи: «Сортировка массива структур по одному из полей по алфавиту»
textual
Листинг программы
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define MAX_STRING_LENGTH 32
#define MAX_BOOKS 5
typedef struct {
char name[MAX_STRING_LENGTH];
char surname[MAX_STRING_LENGTH];
char tel[MAX_STRING_LENGTH];
} book_t;
int sorter (const void * a, const void * b) {
return strcmp (((book_t *)a)->name, ((book_t *)b)->name) > 0;
}
void book_print (book_t * b) {
printf ("name : %s\n"
"surname: %s\n"
"tel : %s\n",
b->name, b->surname, b->tel);
}
void book_printn (book_t * b, size_t num) {
for ( ; num; --num) {
book_print (b++);
printf ("\n-----------------\n");
}
}
int main()
{
/* поля заполнены от балды, потому что я не в курсе
* что именно они должны значить
* и вообще это больше похоже на структуру,
* описывающую `человека'
*/
book_t books[MAX_BOOKS] = {
{ "The Jungle Book", "Rudyard Kipling", "1" },
{ "Frankenstein", "Mary Wollstonecraft", "2" },
{ "The Secret Garden", "Frances Hodgson B", "3" },
{ "Heidi", "Johanna Spyri", "4" },
{ "Enchiridion", "Epictetus", "5" }
};
printf ("---------------- BEFORE SORT ----------------\n");
book_printn (books, MAX_BOOKS);
// сортировка
qsort (books, MAX_BOOKS, sizeof (book_t), sorter);
printf ("---------------- AFTER SORT -----------------\n");
book_printn (books, MAX_BOOKS);
return 0;
}