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

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

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

Написать программу, которая считывает из файла разделенные пробелом числа, игнорируя другие символы, и записывает их в динамическую структуру «Односвязный список». После обработки файла отсортировать полученные числа по возрастанию и записать в новый файл. Числа в файле могут повторяться. Должны присутствовать проверки при работе с файлом. Обязательна очистка выделенной памяти. Сообщения об ошибках в работе программы выводить на экран. Пример: Во входном файле: 15 1 9 -54 37 0 -7 Пример работы программы: ->Введите имя входного файла: file.in Данные из файла загружены. В выходном файле: -54 -7 0 1 9 15 37 Собственно вот сам код:
Листинг программы
  1. #include <stdio.h>
  2. #include <locale.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. typedef struct Numbers{
  6. int value;
  7. struct Numbers *next;//ссылка на след элемент списка
  8. }Num;
  9. char* filename(){//считывание имя файла
  10. char c;
  11. char* ret;
  12. int maxlen=20,len=0;
  13. ret=(char*)malloc(maxlen*(sizeof (char)));
  14. if (ret==NULL){
  15. printf("Ошибка распределения памяти");
  16. return ret;}
  17. c=getchar();
  18. while (c !='\n'){
  19. ret[len]=c;
  20. len++;
  21. c=getchar();
  22. }
  23. ret[len]='\0';
  24. return ret;
  25. }
  26. Num* getLast(Num *head){//перемещение указателя на последний элемент
  27. if (head == NULL){
  28. return NULL;
  29. }
  30. while (head->next){
  31. head = head->next;//перемещение на след звено
  32. }
  33. return head;
  34. }
  35. Num* add_last(Num *head, int value){//добавление элемента в конец списка
  36. Num *last = getLast(head);
  37. Num *tmp = (Num*) malloc(sizeof(Num));
  38. tmp->value = value;
  39. tmp->next = NULL;
  40. last->next = tmp;
  41. }
  42. Num* mergeSort(Num *head){
  43. Num *out, *p1, *p2, *q;
  44. if(head==NULL||head->next==NULL)
  45. return head;
  46. p1=p2=head;
  47. while (p2->next!=NULL && p2->next->next!=NULL){
  48. p1=p1->next;
  49. p2=p2->next;
  50. p2=p2->next;
  51. q=p1->next;}
  52. p1->next=NULL;
  53. head=mergeSort(head);
  54. q=mergeSort(q);
  55. Num OUT;
  56. p1=&OUT;
  57. while(head!=NULL || q!=NULL)
  58. {
  59. if (q==NULL || head!=NULL && head->value < q->value)
  60. p1->next=head,
  61. p1=p1->next,
  62. head=head->next;
  63. else
  64. p1->next=q,
  65. p1=p1->next,
  66. q=q->next;
  67. }
  68. return OUT.next;
  69. }
  70. void printlist(Num* head, FILE *f2){
  71. while(head!=NULL){
  72. fprintf(f2,"%d",head->value);
  73. head=head->value;
  74. }
  75. fprintf(f2,"/n");
  76. }
  77. void cleanup(Num **head){//очистка списка
  78. Num* prev = NULL;
  79. while ((*head)->next) {
  80. prev = (*head);
  81. (*head) = (*head)->next;
  82. free(prev);
  83. }
  84. free(*head);
  85. }
  86. int main(){
  87. setlocale(LC_ALL,"Russian");
  88. Num *head = NULL;
  89. char fn;
  90. int integer = 0;
  91. char reserve = 0;
  92. int c, i, k, j, sum;
  93. sum=0;
  94. j=0;
  95. k=0;
  96. i=0;
  97. c=0;
  98. FILE *f1,*f2;
  99. fn=filename();
  100. f1=fopen(fn,"r");
  101. f2=fopen("output.txt", "w");
  102. if((f1!=NULL)&&(f2!=NULL)){
  103. for (k = 0; reserve != EOF; k++){
  104. c = fgetc(f1);
  105. if (c == '-')
  106. {
  107. integer = k;
  108. }
  109. if ((c >= '0') && (c <= '9'))
  110. {
  111. j++;
  112. i = c - '0';
  113. sum = sum * 10 + i;
  114. }
  115. if ((((c >= '!') && (c <= '/')) || ((c >= ':') && (c <= '~')) || (c == ' ') || (c == EOF)) && ((reserve >= '0') && (reserve <= '9')))
  116. {
  117. if ((k - integer) == j + 1)
  118. sum = sum*(-1);
  119. head = add_last(head, sum);
  120. sum = 0;
  121. j = 0;
  122. }
  123. reserve = c;
  124. }
  125. head=mergeSort(head);
  126. printlist(head,f2);
  127. cleanup(head);
  128. free(fn);
  129. fclose(f1);
  130. fclose(f2);
  131. return 0;
  132. }
  133. else{
  134. if(f1==NULL){
  135. perror(fn);//Если нет файла или прав - ошибка.
  136. fclose(f1);
  137. return 7;
  138. }
  139. if(f2==NULL){
  140. perror("output.txt");//Нет файла - создание. Нет прав - ошибка.
  141. fclose(f2);
  142. return 8;
  143. }
  144. }
  145. }
Проблема в том, что при вводе имени файла программа сразу крашится без вывода каких-либо ошибок и без результата. Так же не пашет сортировка(слиянием) Если можете, то подскажите как реализовать ее пузырьком(с перестановкой самих элементов, а не содержимого). Возможно есть и другие ошибки. Прошу помочь всем, чем возможно и желательно с развернутыми комментариями, ибо пока мне программирование дается тяжело(1 курс)

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

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

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


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

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

13   голосов , оценка 4.077 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы