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

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

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

нужно отсортировать информацию о поездах по номеру поезда. Сортировку нужно сделать изменением узлов. При сортировке просто исчезает вторая строка. подскажите в чем ошибка
Листинг программы
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. struct train {
  6. char punkt[10];
  7. int nomer;
  8. float time;
  9. struct train *next;
  10. };
  11. // присоединение элемента к голове, возврат адреса головы
  12. struct train *create(struct train *head, int n,float t,char *p) {
  13. struct train *element; // указатель на новую структуру
  14. element = (struct train *)malloc(sizeof(struct train)); // выделяем память
  15. element->next = head;
  16. element->nomer = n;
  17. element->time = t;
  18. strcpy(&element->punkt[0],&p[0]);
  19. return element;
  20. }
  21. // печать стека
  22. void print(struct train *p)
  23. {
  24. printf(" ___________________________________\n");
  25. printf("|punkt nazn |nom marsh|otpravlenije\n");
  26. printf("|___________________________________\n");
  27. while (p != NULL)
  28. {
  29. printf("%10s | %7d | %.2f \n ", p->punkt, p->nomer, p->time);
  30. p = p->next; // продвижение по списку
  31. }
  32. printf("\n");
  33. }
  34. void sort(train * list)
  35. {
  36. train *p1,* p2;
  37. int n;float t;char pk[10];
  38. if (list != NULL) { //если стек не пустой
  39. while (list->next != NULL)
  40. { // пока стек не закончится
  41. p1=list;
  42. p2=p1->next;
  43. do
  44. {
  45. if (p2->nomer < p1->nomer) {
  46. p1->next=p2->next;
  47. p2->next=p1;
  48. p1=p2;
  49. }
  50. p2 = p2->next;
  51. } while (p2 != NULL);
  52. list = list->next;
  53. }
  54. }
  55. }
  56. void info(train * list)
  57. {
  58. int n,k=0;
  59. printf("Vvedite nomer poezda\n");
  60. scanf("%d",&n);
  61. while (list->next != NULL)
  62. {
  63. if (list->nomer==n) { printf("%10s | %7d | %.2f \n ", list->punkt, list->nomer, list->time);break;}
  64. else k++;
  65. list = list->next;
  66. if(list->next == NULL || k==0){printf("poezd ne najden\n");}
  67. }
  68. }
  69. int main()
  70. {
  71. int n,k=0;float t;char p[10];
  72. struct train *head; // адрес, указывающий на голову стека
  73. head = NULL;
  74. FILE *f;
  75. f = fopen("train.txt","r");
  76. while (!feof(f))
  77. {
  78. fscanf(f,"%s %d %f", &p, &n, &t);
  79. head=create(head,n,t,p);
  80. }
  81. print(head);
  82. for(;;)
  83. {
  84. printf("Vyberite operaciju\n 1 - sortirovka po nomeru poezda\n 2 - poisk poezda po nomeru\n");
  85. scanf("%d",&k);
  86. if (k==1){sort(head);
  87. print(head);}
  88. else{if(k==2) {info(head);}
  89. else break;
  90. }
  91. }
  92. fclose(f);
  93. free(head);
  94. getch();
  95. return 0;
  96. }

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

textual
Листинг программы
  1. struct train *udal(struct train * head, struct train * del) {   // element pered udal
  2.     struct train *prev;

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

  1. В первой строке объявляется структура train и переменная prev типа struct train*
  2. Переменная prev инициализируется значением head
  3. Переменная del передается в функцию udal
  4. В цикле while выполняется условие, пока del не станет равным NULL
  5. Внутри цикла prev присваивается значение del
  6. Переменная del присваивается значение prev->next
  7. В цикле while выполняется условие, пока prev не станет равным NULL
  8. Внутри цикла prev->next присваивается значение del
  9. Переменная del присваивается значение prev
  10. Переменная prev присваивается значение NULL
  11. В конце функции возвращается значение head

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


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

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

13   голосов , оценка 4.231 из 5

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

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

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