Segmentation fault в функции печати односвязного списка - C (СИ)

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

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

Доброго времени суток, программа первый список печатает, два другие нет, в чем может быть проблема?
Листинг программы
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. typedef struct Record {
  4. float a;
  5. struct Record *next;
  6. } List;
  7. List* min_node(List *n){
  8. List *minNode = n;
  9. while ( n = n->next )
  10. if ( n->a < minNode->a )
  11. minNode = n;
  12. return minNode;
  13. }
  14. void swap_vals(List *a, List *b){
  15. float val;
  16. val = a->a;
  17. a->a = b->a;
  18. b->a = val;
  19. }
  20. void sort_nodes(List *n, int nn){
  21. List *minNode;
  22. while (n->next){
  23. if ((minNode = min_node(n)) != n)
  24. swap_vals(n, minNode);
  25. n = n->next;
  26. }
  27. }
  28. void addElementToList(List **u, float x){
  29. List *t = malloc(sizeof(List));
  30. t->a = x;
  31. t->next = *u;
  32. *u = t;
  33. }
  34. void print_nodes(List *n){
  35. List* p = n;
  36. while (p){
  37. printf("%02f ", p->a);
  38. p = p->next;
  39. }
  40. printf("\n");
  41. }
  42. int main(){
  43. List *u = NULL,
  44. *odd, *even, *p;
  45. int n, i;
  46. float t;
  47. char* s;
  48. printf("Введите кол-во чисел: ");
  49. scanf("%d", &n);
  50. printf("Вводите числа через пробел:\n");
  51. for(i = 0; i < n; ++i) {
  52. scanf("%e", &t);
  53. addElementToList(&u, t);
  54. }
  55. sort_nodes(u, n);
  56. p = u;
  57. while(p){/*заполнение двух списков четными и нечетными значениями*/
  58. if((int)(p->a) % 2 == 0) addElementToList(&odd, p->a);
  59. else addElementToList(&even, p->a);
  60. p = p->next;
  61. }
  62. print_nodes(u);
  63. printf("\n");
  64. print_nodes(odd);
  65. printf("\n");
  66. print_nodes(even);
  67. return 0;
  68. }

Решение задачи: «Segmentation fault в функции печати односвязного списка»

textual
Листинг программы
  1. p = u;
  2.     while(p){/*заполнение двух списков четными и нечетными значениями*/
  3.         if((int)(p->a) % 2 == 0) addElementToList(&odd, p->a);
  4.         else addElementToList(&even, p->a);
  5.         p = p->next;
  6.     }
  7.     p = u;
  8.     file = fopen(argv, "w");//запись в файл
  9.     while(p){
  10.         fprintf(file, "%f ", p->a);
  11.         p = p->next;
  12.     }
  13.     fprintf(file, "\n");
  14.     p = odd;
  15.     while(p){
  16.         fprintf(file, "%f ", p->a);
  17.         p = p->next;
  18.     }
  19.     fprintf(file, "\n");
  20.     p = even;
  21.     while(p){
  22.         fprintf(file, "%f ", p->a);
  23.         p = p->next;
  24.     }
  25.     fclose(file);

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

В данном коде выполняется следующие действия:

  1. Создается указатель p и инициализируется значением u.
  2. Запускается цикл, который проходит по всем элементам списка, начиная с u. Внутри цикла выполняются следующие действия:
    • Проверяется, является ли значение p->a четным числом. Если это так, то оно добавляется в список odd. Если нет - в список even.
    • Указатель p увеличивается на значение p->next, чтобы перейти к следующему элементу списка.
  3. После завершения цикла, создается файл с помощью функции fopen и записывается в него информация из списка even.
  4. Затем, в цикле, проходящем по всем элементам списка odd, записывается в файл информация о каждом элементе.
  5. После завершения цикла, закрывается файл с помощью функции fclose.

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


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

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

11   голосов , оценка 4.273 из 5

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

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

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