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