Сортировка пузырьком массива структур по одному из полей - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите сделать символьную сортировку пузырьком для "avtor" , заранее спасибо)
Листинг программы
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5. struct book
  6. {
  7. char name[16];
  8. char izd[32];
  9. char year[64];
  10. char pg[64];
  11. char avtor;
  12. };
  13. struct List
  14. {
  15. book sotr;
  16. List *pNext;
  17. };
  18.  
  19. void addFirst(List *& pF, List* p)
  20. {
  21. p->pNext = pF;
  22. pF = p;
  23. }
  24. List * delFirst(List *&pF)
  25. {
  26. if (pF == 0) return 0;
  27. List *p = pF;
  28. pF = pF->pNext;
  29. return p;
  30. }
  31. bool add(List *&pF, List * pZad, List *p)
  32. {
  33. if (pZad == pF)
  34. {
  35. p->pNext = pF;
  36. pF = p;
  37. return true;
  38. }
  39. List *pPred = pF;
  40. while (pPred->pNext != pZad && pPred->pNext)
  41. pPred = pPred->pNext;
  42. if (pPred->pNext == 0) return false;
  43. p->pNext = pZad;
  44. pPred->pNext = p;
  45.  
  46. return true;
  47. }
  48. List * del(List*& pF, List *p)
  49. {
  50. if (pF == 0) return 0;
  51. if (pF == p)
  52. {
  53. pF = pF->pNext;
  54. return p;
  55. }
  56. else
  57. {
  58. List *pPred = pF;
  59. while (pPred->pNext != p && pPred->pNext)
  60. pPred = pPred->pNext;
  61. if (pPred->pNext == 0) return 0;
  62. pPred->pNext = p->pNext;
  63. return p;
  64. }
  65. while (delFirst(pF));
  66. }
  67. int main(int argc, char* argv[])
  68. {
  69. List *pF = 0;
  70. List *p;
  71. char Ch;
  72. do
  73. {
  74. p = (List *)malloc(sizeof(List));
  75. printf("maxspid: ");
  76. fflush(stdin); gets_s(p->sotr.name);
  77. printf("power: ");
  78. fflush(stdin); gets_s(p->sotr.izd);
  79. printf("trass:");
  80. fflush(stdin); gets_s(p->sotr.year);
  81. printf("city:");
  82. fflush(stdin); gets_s(p->sotr.pg);
  83. printf("avtor:");
  84. fflush(stdin); scanf_s("%s",p->sotr.avtor);
  85. addFirst(pF, p);
  86. printf("For continue press Y or y else any key! ");
  87. Ch = _getche();
  88. } while (Ch == 'Y' || Ch == 'y');
  89.  
  90. for (List *pi = pF; pi->pNext;)
  91. {
  92. double min = pi->sotr.avtor;
  93. List *pmin = pi;
  94. for (List *pj = pi->pNext; pj; pj = pj->pNext)
  95. if (pj->sotr.avtor<min)
  96. {
  97. min = pj->sotr.avtor;
  98. pmin = pj;
  99. }
  100. if (pi != pmin)
  101. {
  102. del(pF, pmin);
  103. add(pF, pi, pmin);
  104. }
  105. else pi = pi->pNext;
  106. }
  107. printf("\nSrting:");
  108. for (List *pi = pF; pi; pi = pi->pNext)
  109. printf("\n avtor- %s ", pi->sotr.avtor);
  110. printf("\nFor exit press any key ");
  111. system("pause");
  112. return 0;
  113. }

Решение задачи: «Сортировка пузырьком массива структур по одному из полей»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4. #include <stdlib.h>
  5.  
  6. struct book {
  7.     char name[16];
  8.     char izd[32];
  9.     char year[64];
  10.     char pg[64];
  11.     char avtor;
  12. };
  13.  
  14. struct List {
  15.     struct book sotr;
  16.     struct List *pNext;
  17. };
  18.  
  19. void List_Add(struct List** lst, struct book* b){
  20.         struct List* p = (struct List*)malloc(sizeof(struct List));
  21.         if(p != NULL){
  22.                 memcpy(&p->sotr, b, sizeof(*b));
  23.                 p->pNext = *lst;
  24.                 *lst = p;
  25.         }
  26. }
  27.  
  28. //сортировка списка методом Пузырька
  29. void List_BSort(struct List** lst, int (*cmp)(const struct book*, const struct book*)){
  30.     int    chk;
  31.     struct List* p, *a, *b, *t1, *t2;
  32.     if((*lst == NULL) || ((*lst)->pNext == NULL))
  33.         return;
  34.     do {
  35.         chk   = 0;
  36.         a = p = (*lst);
  37.         b = (*lst)->pNext;
  38.         while(b != NULL){
  39.             if((*cmp)(&b->sotr, &a->sotr)){
  40.                 t2 = p;
  41.                 t1 = b->pNext;
  42.  
  43.                 if(a == *lst)
  44.                     *lst = b;
  45.                 else
  46.                     p->pNext = b;
  47.  
  48.                 b->pNext = a;
  49.                 a->pNext = t1;
  50.  
  51.                 t1  = a;
  52.                 a   = b;
  53.                 b   = t1;
  54.                 p   = t2;
  55.                 chk = 1;
  56.             }
  57.             p = a;
  58.             a = a->pNext;
  59.             b = b->pNext;
  60.         }
  61.     } while(chk);
  62. }
  63.  
  64. static int compare(const struct book* a, const struct book* b){
  65.         return (a->avtor < b->avtor);
  66. }
  67.  
  68.  
  69. int main(void){
  70.         int i;
  71.         struct book  b;
  72.         struct List* p, *lst = NULL;
  73.  
  74.         for(i = 0; i < 10; ++i){
  75.                 b.avtor = 'A' + (rand() % 12);
  76.                 sprintf(b.name, "USER-%d", i);
  77.                 List_Add(&lst, &b);
  78.         }
  79.  
  80.         for(p = lst; p != NULL; p = p->pNext){
  81.                 printf("%c - %s\n", p->sotr.avtor, p->sotr.name);
  82.         }
  83.         putchar('\n');
  84.        
  85.         //сортируем
  86.         List_BSort(&lst, compare);
  87.        
  88.         for(p = lst; p != NULL; p = p->pNext){
  89.                 printf("%c - %s\n", p->sotr.avtor, p->sotr.name);
  90.         }        
  91.         return 0;
  92. }

Объяснение кода листинга программы

  1. Структура book содержит поля name, izd, year, pg и avtor.
  2. Структура List содержит поле sotr типа book и указатель pNext на следующий элемент списка.
  3. Функция List_Add добавляет новый элемент списка, содержащий копию переданного ей элемента b.
  4. Функция List_BSort использует метод Пузырька для сортировки списка по полю avtor структур book.
  5. Статическая функция compare сравнивает два элемента списка по полю avtor.
  6. В функции main создается список из 10 элементов, добавляемых с помощью функции List_Add.
  7. Список выводится на экран с помощью цикла for.
  8. Затем список сортируется с помощью функции List_BSort и выводится на экран снова.
  9. Для сортировки используется метод Пузырька, который сравнивает пары соседних элементов и меняет их местами, если они стоят не в нужном порядке.
  10. Цикл do-while в функции List_BSort продолжается, пока не будет отсортирован в нужном порядке.
  11. Значение chk используется для контроля корректности работы алгоритма сортировки.
  12. Значение p используется как временная переменная в процессе сортировки.
  13. Значение a используется как текущий элемент списка.
  14. Значение b используется как следующий элемент списка.
  15. Значение t1 используется как временная переменная для хранения p->pNext.
  16. Значение t2 используется как временная переменная для хранения p.
  17. Значение t1 используется как временная переменная для хранения a->pNext.
  18. Значение t2 используется как временная переменная для хранения a.
  19. Значение a используется как следующий элемент списка после b.
  20. Значение b используется как текущий элемент списка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы