Сортировка пузырьком массива структур по одному из полей - C (СИ)
Формулировка задачи:
Помогите сделать символьную сортировку пузырьком для "avtor" , заранее спасибо)
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <conio.h> struct book { char name[16]; char izd[32]; char year[64]; char pg[64]; char avtor; }; struct List { book sotr; List *pNext; }; void addFirst(List *& pF, List* p) { p->pNext = pF; pF = p; } List * delFirst(List *&pF) { if (pF == 0) return 0; List *p = pF; pF = pF->pNext; return p; } bool add(List *&pF, List * pZad, List *p) { if (pZad == pF) { p->pNext = pF; pF = p; return true; } List *pPred = pF; while (pPred->pNext != pZad && pPred->pNext) pPred = pPred->pNext; if (pPred->pNext == 0) return false; p->pNext = pZad; pPred->pNext = p; return true; } List * del(List*& pF, List *p) { if (pF == 0) return 0; if (pF == p) { pF = pF->pNext; return p; } else { List *pPred = pF; while (pPred->pNext != p && pPred->pNext) pPred = pPred->pNext; if (pPred->pNext == 0) return 0; pPred->pNext = p->pNext; return p; } while (delFirst(pF)); } int main(int argc, char* argv[]) { List *pF = 0; List *p; char Ch; do { p = (List *)malloc(sizeof(List)); printf("maxspid: "); fflush(stdin); gets_s(p->sotr.name); printf("power: "); fflush(stdin); gets_s(p->sotr.izd); printf("trass:"); fflush(stdin); gets_s(p->sotr.year); printf("city:"); fflush(stdin); gets_s(p->sotr.pg); printf("avtor:"); fflush(stdin); scanf_s("%s",p->sotr.avtor); addFirst(pF, p); printf("For continue press Y or y else any key! "); Ch = _getche(); } while (Ch == 'Y' || Ch == 'y'); for (List *pi = pF; pi->pNext;) { double min = pi->sotr.avtor; List *pmin = pi; for (List *pj = pi->pNext; pj; pj = pj->pNext) if (pj->sotr.avtor<min) { min = pj->sotr.avtor; pmin = pj; } if (pi != pmin) { del(pF, pmin); add(pF, pi, pmin); } else pi = pi->pNext; } printf("\nSrting:"); for (List *pi = pF; pi; pi = pi->pNext) printf("\n avtor- %s ", pi->sotr.avtor); printf("\nFor exit press any key "); system("pause"); return 0; }
Решение задачи: «Сортировка пузырьком массива структур по одному из полей»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> struct book { char name[16]; char izd[32]; char year[64]; char pg[64]; char avtor; }; struct List { struct book sotr; struct List *pNext; }; void List_Add(struct List** lst, struct book* b){ struct List* p = (struct List*)malloc(sizeof(struct List)); if(p != NULL){ memcpy(&p->sotr, b, sizeof(*b)); p->pNext = *lst; *lst = p; } } //сортировка списка методом Пузырька void List_BSort(struct List** lst, int (*cmp)(const struct book*, const struct book*)){ int chk; struct List* p, *a, *b, *t1, *t2; if((*lst == NULL) || ((*lst)->pNext == NULL)) return; do { chk = 0; a = p = (*lst); b = (*lst)->pNext; while(b != NULL){ if((*cmp)(&b->sotr, &a->sotr)){ t2 = p; t1 = b->pNext; if(a == *lst) *lst = b; else p->pNext = b; b->pNext = a; a->pNext = t1; t1 = a; a = b; b = t1; p = t2; chk = 1; } p = a; a = a->pNext; b = b->pNext; } } while(chk); } static int compare(const struct book* a, const struct book* b){ return (a->avtor < b->avtor); } int main(void){ int i; struct book b; struct List* p, *lst = NULL; for(i = 0; i < 10; ++i){ b.avtor = 'A' + (rand() % 12); sprintf(b.name, "USER-%d", i); List_Add(&lst, &b); } for(p = lst; p != NULL; p = p->pNext){ printf("%c - %s\n", p->sotr.avtor, p->sotr.name); } putchar('\n'); //сортируем List_BSort(&lst, compare); for(p = lst; p != NULL; p = p->pNext){ printf("%c - %s\n", p->sotr.avtor, p->sotr.name); } return 0; }
Объяснение кода листинга программы
- Структура
book
содержит поляname
,izd
,year
,pg
иavtor
. - Структура
List
содержит полеsotr
типаbook
и указательpNext
на следующий элемент списка. - Функция
List_Add
добавляет новый элемент списка, содержащий копию переданного ей элементаb
. - Функция
List_BSort
использует метод Пузырька для сортировки списка по полюavtor
структурbook
. - Статическая функция
compare
сравнивает два элемента списка по полюavtor
. - В функции
main
создается список из 10 элементов, добавляемых с помощью функцииList_Add
. - Список выводится на экран с помощью цикла
for
. - Затем список сортируется с помощью функции
List_BSort
и выводится на экран снова. - Для сортировки используется метод Пузырька, который сравнивает пары соседних элементов и меняет их местами, если они стоят не в нужном порядке.
- Цикл
do-while
в функцииList_BSort
продолжается, пока не будет отсортирован в нужном порядке. - Значение
chk
используется для контроля корректности работы алгоритма сортировки. - Значение
p
используется как временная переменная в процессе сортировки. - Значение
a
используется как текущий элемент списка. - Значение
b
используется как следующий элемент списка. - Значение
t1
используется как временная переменная для храненияp->pNext
. - Значение
t2
используется как временная переменная для храненияp
. - Значение
t1
используется как временная переменная для храненияa->pNext
. - Значение
t2
используется как временная переменная для храненияa
. - Значение
a
используется как следующий элемент списка послеb
. - Значение
b
используется как текущий элемент списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д