Сортировка динамического списка - C (СИ)

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

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

Помогите пожалуйста. Пишу программу для сортировки динамического списка.
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct Config {
  5. int Amount;
  6. char Input_method[10];
  7. char Sorting_method[15];
  8. int Bottom_interval;
  9. int The_top_interval;
  10. };
  11. struct List {
  12. int info;
  13. struct List *next;
  14. };
  15. struct List *Create (void)
  16. {
  17. struct List *tmp;
  18. tmp=((struct List*)malloc(sizeof(struct List)));
  19. tmp -> info =0;
  20. tmp -> next =NULL;
  21. return tmp;
  22. }
  23. struct List *Addr(int Nom,struct List *Start)
  24. {
  25. struct List *tmp;
  26. int i;
  27. tmp=Start;
  28. for(i=1;i<Nom;i++)
  29. {
  30. tmp=tmp -> next;
  31. }
  32. return tmp ->next;
  33. }
  34. int Val(struct List *Start,int Numb)
  35. {
  36. struct List *tmp;
  37. tmp=Addr(Numb,Start);
  38. return tmp -> info;
  39. }
  40. void Append(struct List *Start,int Nam)
  41. {
  42. struct List *Last, *New_last;
  43. Last=Addr(Start -> info, Start);
  44. New_last=((struct List*)malloc(sizeof(struct List)));
  45. New_last -> info=Nam;
  46. New_last -> next =NULL;
  47. Last -> next=New_last;
  48. Start -> info++;
  49. }
  50. void Change(struct List *Start,int i,int j )
  51. {
  52. struct List *before, *Listi, *Listj;
  53. before=Addr(i-1,Start);
  54. Listi=before -> next;
  55. Listj=Listi -> next;
  56. before -> next=Listj;
  57. Listi -> next=Listj -> next;
  58. Listj -> next=Listi;
  59. }
  60. void Print(struct List *Start)
  61. {
  62. int i;
  63. for(i=1;i<=Start -> info;i++)
  64. {
  65. printf("%d ",Val(Start,i));
  66. }
  67. }
  68. void Confg_Read (FILE *fin, struct Config *Conf)
  69. {
  70. char buffer[220];
  71. Conf -> Amount = 10;
  72. strcpy(Conf -> Input_method,"rand");
  73. strcpy(Conf -> Sorting_method,"increase");
  74. Conf -> Bottom_interval = -50;
  75. Conf -> The_top_interval = 50;
  76. while (!feof(fin))
  77. {
  78. fgets(buffer,210,fin);
  79. if(buffer[0]!='#')
  80. {
  81. if(buffer[0]=='!'){ puts(buffer);}
  82. if(strstr(buffer,"Amount:"))
  83. {
  84. Conf -> Amount = atoi(strstr(buffer,"Amount:")+7);
  85. }
  86. if(strstr(buffer,"Input method:"))
  87. {
  88. strcpy(Conf -> Input_method,strstr(buffer,"Input method:")+13);
  89. }
  90. if(strstr(buffer,"Sorting method:"))
  91. {
  92. strcpy(Conf -> Sorting_method,strstr(buffer,"Sorting method:")+15);
  93. }
  94. if(strstr(buffer,"Bottom interval:"))
  95. {
  96. Conf -> Bottom_interval=atoi(strstr(buffer,"Bottom interval:")+16);
  97. }
  98. if(strstr(buffer,"The top interval:"))
  99. {
  100. Conf -> The_top_interval=atoi(strstr(buffer,"The top interval:")+17);
  101. }
  102. }
  103. }
  104. if (Conf -> Amount < 2 || Conf -> Amount > 25)
  105. {
  106. Conf -> Amount = 10;
  107. puts("Параметр Amount взят по умолчанию (10)");
  108. }
  109. if (strstr(Conf -> Input_method,"rand")!=NULL && strstr(Conf -> Input_method,"hand")!=NULL)
  110. {
  111. strcpy(Conf -> Input_method,"rand");
  112. puts("Параметр Input method Взят по умолчанию (rand)");
  113. }
  114. if (strstr(Conf -> Sorting_method,"increase")==NULL && strstr(Conf -> Sorting_method,"decrease")==NULL)
  115. {
  116. strcpy(Conf -> Sorting_method,"increase");
  117. puts("Параметр Sorting method Взят по умолчанию (increase)");
  118. }
  119. }
  120.  
  121. int main(int argc,char *argv[])
  122. {
  123. FILE *fcfg;
  124. struct Config *Conf1;
  125. struct List *Start;
  126. char buffer[50];
  127. int i,j,in;
  128. if (argc<2)
  129. {
  130. puts("Конфиг-Файл не указан");
  131. exit(1);
  132. }
  133. if((fcfg=fopen(argv[1],"r"))==NULL)
  134. {
  135. puts("Не удалось открыть конфиг файл");
  136. exit(0);
  137. }
  138. fgets(buffer,5,fcfg);
  139. if (strncmp(buffer,"#CFG",4)!=0)
  140. {
  141. puts("Открытый файл не является Конфигурационным файлом для этой программы.");
  142. exit(0);
  143. }
  144. Start=Create();
  145. Conf1=((struct Config*)malloc(sizeof(struct Config)));
  146. Confg_Read(fcfg,Conf1);
  147. if(strncmp(Conf1 -> Input_method,"hand",4)==0)
  148. {
  149. for(i=1;i<=Conf1 -> Amount;i++)
  150. {
  151. printf("Введите элемент с номером %d\n",i);
  152. fgets(buffer,6,stdin);
  153. Append(Start,atoi(buffer));
  154. }
  155. }
  156. in=Conf1 -> The_top_interval - Conf1 -> Bottom_interval;
  157. if(strncmp(Conf1 -> Input_method,"hand",4)==0)
  158. {
  159. for(i=1;i<=Conf1 -> Amount;i++)
  160. {
  161. j=(rand()%in - Conf1 -> Bottom_interval);
  162. Append(Start,j);
  163. }
  164. }
  165. puts("Введенный список:");
  166. Print(Start);
  167. if(strstr(Conf1 -> Sorting_method,"increase")==0)
  168. {
  169. p: in=0;
  170. for(i=1;i<=Conf1 -> Amount;i++)
  171. {
  172. if(Val(Start,i)>Val(Start,i+1))
  173. {
  174. Change(Start,i,i+1);
  175. in=1;
  176. }
  177. }
  178. if(in==1) goto p;
  179. }
  180. if(strstr(Conf1 -> Sorting_method,"decrease")==0)
  181. {
  182. T: in=0;
  183. for(i=1;i<=Conf1 -> Amount;i++)
  184. {
  185. if(Val(Start,i)<Val(Start,i+1))
  186. {
  187. Change(Start,i,i+1);
  188. in=1;
  189. }
  190. }
  191. if(in==1) goto T;
  192. }
  193. puts("Полученный список:");
  194. Print(Start);
  195.  
  196. free(Conf1);
  197. return 0;
  198. }
Компилятор съедает, запускаю программу пишет "Ошибка сегментирования" на 188 строке.

Решение задачи: «Сортировка динамического списка»

textual
Листинг программы
  1. void Print(struct List *Start)
  2. {
  3.   while (start){
  4.    printf("%d ", start->info);
  5.    start=start->next;
  6.   }
  7. }

Объяснение кода листинга программы

В данном коде представлена функция с именем Print, которая принимает в качестве аргумента указатель на начало списка (struct List *Start). Внутри функции используется цикл while, который выполняется до тех пор, пока указатель start не станет равным NULL.

  1. Начинается выполнение функции с инициализации указателя start значением, переданным в качестве аргумента.
  2. Внутри цикла while происходит вывод значения переменной start->info с помощью функции printf, а затем указатель start обновляется путем инкрементации на 1 и перехода к следующему элементу списка (start->next).
  3. Цикл продолжается до тех пор, пока не будет достигнут конец списка (т.е. значение указателя start станет равным NULL).
  4. Функция завершается после выполнения цикла while.

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


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

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

6   голосов , оценка 4.167 из 5

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

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

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