Не работает сортировка односвязного списка с считыванием из файла и выводом в файл - 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);