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);

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

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

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

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


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

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

11   голосов , оценка 4.273 из 5
Похожие ответы