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.