Сортировка односвязного списка - C (СИ) (78410)
Формулировка задачи:
Всем доброго времени суток!
Пишу курсавик по программированию, всё написал, осталась только одна функция уже голову всю сломал, никак не придумаю как же её реализовать , может вы чем сможите мне помочь, буду очень благодарен!
Нужно всего лишь отсортировать односвязный список:
Правда необходимо выполнить две сортировки:
1) По фамилии и имени(можно просто по фамилии) в алфавитном порядке.
2) По дате рождения.
Записей около 45...
struct account
{
int visual;
int number;
char name[9];
char surname[12];
char nickname[9];
char hometown[11];
char residence[12];
int birthday;
int month;
int year;
char phone[12];
struct account *nextPtr;
}Решение задачи: «Сортировка односвязного списка»
textual
Листинг программы
void swap(struct account** plist, int pos_a, int pos_b) {
int tmp;
struct account* first = *plist;
struct account* last = *plist;
while( pos_a-- )
first = first->nextPtr;
if(first == NULL)
return;
while( pos_b-- )
last = last->nextPtr;
if(last == NULL)
return;
tmp = first->visual;
first->visual = last->visual;
last->visual = tmp;
// здесь перестановку делай также как в сортировке
// для каждого элемента структуры
// дело в том что указатель это адрес а память физически выделяется для того чтобы
// сменить данные под этот указатель нужно данные переместить в тот указатель с копировать
// без манипуляции стека не обойтись
}
int length(const struct account* plist) {
int len = 0;
for(; plist != NULL ;len++, plist = plist->nextPtr);
return len;
}
void main(void) {
size = length(list); // получить размер списка
// обменять последнее значение с серединным
swap(&list, size - 1, size >> 1);
}
Объяснение кода листинга программы
void swap(struct account** plist, int pos_a, int pos_b)- функция для обмена элементов в односвязном списке.int length(const struct account* plist)- функция для определения длины списка.void main(void)- точка входа в программу. Вычисляется размер списка, и выполняется обмен элементов в списке.