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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д