Segmentation fault в функции печати односвязного списка - C (СИ)
Формулировка задачи:
Доброго времени суток, программа первый список печатает, два другие нет, в чем может быть проблема?
#include "stdio.h" #include "stdlib.h" typedef struct Record { float a; struct Record *next; } List; List* min_node(List *n){ List *minNode = n; while ( n = n->next ) if ( n->a < minNode->a ) minNode = n; return minNode; } void swap_vals(List *a, List *b){ float val; val = a->a; a->a = b->a; b->a = val; } void sort_nodes(List *n, int nn){ List *minNode; while (n->next){ if ((minNode = min_node(n)) != n) swap_vals(n, minNode); n = n->next; } } void addElementToList(List **u, float x){ List *t = malloc(sizeof(List)); t->a = x; t->next = *u; *u = t; } void print_nodes(List *n){ List* p = n; while (p){ printf("%02f ", p->a); p = p->next; } printf("\n"); } int main(){ List *u = NULL, *odd, *even, *p; int n, i; float t; char* s; printf("Введите кол-во чисел: "); scanf("%d", &n); printf("Вводите числа через пробел:\n"); for(i = 0; i < n; ++i) { scanf("%e", &t); addElementToList(&u, t); } sort_nodes(u, n); p = u; while(p){/*заполнение двух списков четными и нечетными значениями*/ if((int)(p->a) % 2 == 0) addElementToList(&odd, p->a); else addElementToList(&even, p->a); p = p->next; } print_nodes(u); printf("\n"); print_nodes(odd); printf("\n"); print_nodes(even); return 0; }
Решение задачи: «Segmentation fault в функции печати односвязного списка»
textual
Листинг программы
p = u; while(p){/*заполнение двух списков четными и нечетными значениями*/ if((int)(p->a) % 2 == 0) addElementToList(&odd, p->a); else addElementToList(&even, p->a); p = p->next; } p = u; file = fopen(argv, "w");//запись в файл while(p){ fprintf(file, "%f ", p->a); p = p->next; } fprintf(file, "\n"); p = odd; while(p){ fprintf(file, "%f ", p->a); p = p->next; } fprintf(file, "\n"); p = even; while(p){ fprintf(file, "%f ", p->a); p = p->next; } fclose(file);
Объяснение кода листинга программы
В данном коде выполняется следующие действия:
- Создается указатель
p
и инициализируется значениемu
. - Запускается цикл, который проходит по всем элементам списка, начиная с
u
. Внутри цикла выполняются следующие действия:- Проверяется, является ли значение
p->a
четным числом. Если это так, то оно добавляется в списокodd
. Если нет - в списокeven
. - Указатель
p
увеличивается на значениеp->next
, чтобы перейти к следующему элементу списка.
- Проверяется, является ли значение
- После завершения цикла, создается файл с помощью функции
fopen
и записывается в него информация из спискаeven
. - Затем, в цикле, проходящем по всем элементам списка
odd
, записывается в файл информация о каждом элементе. - После завершения цикла, закрывается файл с помощью функции
fclose
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д