Не работает сортировка односвязного списка с считыванием из файла и выводом в файл - C (СИ)
Формулировка задачи:
Написать программу, которая считывает из файла разделенные пробелом числа, игнорируя другие символы, и записывает их в динамическую структуру «Односвязный список». После обработки файла отсортировать полученные числа по возрастанию и записать в новый файл. Числа в файле могут повторяться. Должны присутствовать проверки при работе с файлом. Обязательна очистка выделенной памяти. Сообщения об ошибках в работе программы выводить на экран.
Пример: Во входном файле:
15 1 9 -54 37 0 -7
Пример работы программы:
->Введите имя входного файла: file.in
Данные из файла загружены.
В выходном файле:
-54 -7 0 1 9 15 37
Собственно вот сам код:
Проблема в том, что при вводе имени файла программа сразу крашится без вывода каких-либо ошибок и без результата. Так же не пашет сортировка(слиянием) Если можете, то подскажите как реализовать ее пузырьком(с перестановкой самих элементов, а не содержимого). Возможно есть и другие ошибки. Прошу помочь всем, чем возможно и желательно с развернутыми комментариями, ибо пока мне программирование дается тяжело(1 курс)
#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; } } }
Решение задачи: «Не работает сортировка односвязного списка с считыванием из файла и выводом в файл»
textual
Листинг программы
void readFilename(char *fn, int size);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д