Не работает сортировка односвязного списка с считыванием из файла и выводом в файл - C (СИ)

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

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

Написать программу, которая считывает из файла разделенные пробелом числа, игнорируя другие символы, и записывает их в динамическую структуру «Односвязный список». После обработки файла отсортировать полученные числа по возрастанию и записать в новый файл. Числа в файле могут повторяться. Должны присутствовать проверки при работе с файлом. Обязательна очистка выделенной памяти. Сообщения об ошибках в работе программы выводить на экран. Пример: Во входном файле: 15 1 9 -54 37 0 -7 Пример работы программы: ->Введите имя входного файла: file.in Данные из файла загружены. В выходном файле: -54 -7 0 1 9 15 37 Собственно вот сам код:
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
 
typedef struct Numbers{
    int value;
    struct Numbers *next;//ссылка на след элемент списка
}Num;
 
char* filename(){//считывание имя файла
    char c;
    char* ret;
    int maxlen=20,len=0;
    ret=(char*)malloc(maxlen*(sizeof (char)));
    if (ret==NULL){
        printf("Ошибка распределения памяти");
        return ret;}
    c=getchar();
    while (c !='\n'){
        ret[len]=c;
        len++;
        c=getchar();
    }
    ret[len]='\0';
    return ret;
}
Num* getLast(Num *head){//перемещение указателя на последний элемент
    if (head == NULL){
        return NULL;
    }
    while (head->next){
        head = head->next;//перемещение на след звено
    }
    return head;
}
Num* add_last(Num *head, int value){//добавление элемента в конец списка
    Num *last = getLast(head);
    Num *tmp = (Num*) malloc(sizeof(Num));
    tmp->value = value;
    tmp->next = NULL;
    last->next = tmp;
}
Num* mergeSort(Num *head){
    Num *out, *p1, *p2, *q;
    if(head==NULL||head->next==NULL)
        return head;
    p1=p2=head;
    while (p2->next!=NULL && p2->next->next!=NULL){
        p1=p1->next;
        p2=p2->next;
        p2=p2->next;
        q=p1->next;}                                          
    p1->next=NULL;
    head=mergeSort(head);                                         
    q=mergeSort(q);
    Num OUT;                                               
    p1=&OUT;                                            
    while(head!=NULL || q!=NULL)                     
            {                                               
            if (q==NULL || head!=NULL && head->value < q->value)
                p1->next=head,                   
                p1=p1->next,                 
                head=head->next;
            else
                p1->next=q,                   
                p1=p1->next,                 
                q=q->next;
            }
return OUT.next;
}
void printlist(Num* head, FILE *f2){
    while(head!=NULL){
        fprintf(f2,"%d",head->value);
        head=head->value;
    }
    fprintf(f2,"/n");
}
void cleanup(Num **head){//очистка списка
    Num* prev = NULL;
    while ((*head)->next) {
        prev = (*head);
        (*head) = (*head)->next;
        free(prev);
    }
    free(*head);    
}
int main(){
    setlocale(LC_ALL,"Russian");
    Num *head = NULL;
    char fn;
    int integer = 0;
    char reserve = 0;
    int c, i, k, j, sum;
    sum=0;
    j=0;
    k=0;
    i=0;
    c=0;
    FILE *f1,*f2;
    fn=filename();
    f1=fopen(fn,"r");
    f2=fopen("output.txt", "w");
    if((f1!=NULL)&&(f2!=NULL)){
        for (k = 0; reserve != EOF; k++){
        c = fgetc(f1);
        if (c == '-')
        {
            integer = k;
        }
        if ((c >= '0') && (c <= '9'))
        {
            j++;
            i = c - '0';
            sum = sum * 10 + i;
        }
        if ((((c >= '!') && (c <= '/')) || ((c >= ':') && (c <= '~')) || (c == ' ') || (c == EOF)) && ((reserve >= '0') && (reserve <= '9')))
        {
            if ((k - integer) == j + 1)
            sum = sum*(-1);
            head = add_last(head, sum);
            sum = 0;
            j = 0;
        }
            reserve = c;
        }
        head=mergeSort(head);
        printlist(head,f2);
        cleanup(head);
        free(fn);
        fclose(f1);
        fclose(f2);
        return 0;
    }
    else{
        if(f1==NULL){
            perror(fn);//Если нет файла или прав - ошибка.
            fclose(f1);
            return 7;
        }
        if(f2==NULL){
            perror("output.txt");//Нет файла - создание. Нет прав - ошибка.
            fclose(f2);
            return 8;
        }
    }
}
Проблема в том, что при вводе имени файла программа сразу крашится без вывода каких-либо ошибок и без результата. Так же не пашет сортировка(слиянием) Если можете, то подскажите как реализовать ее пузырьком(с перестановкой самих элементов, а не содержимого). Возможно есть и другие ошибки. Прошу помочь всем, чем возможно и желательно с развернутыми комментариями, ибо пока мне программирование дается тяжело(1 курс)

Решение задачи: «Не работает сортировка односвязного списка с считыванием из файла и выводом в файл»

textual
Листинг программы
void readFilename(char *fn, int size);

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


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

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

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