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

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

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

Пробую решать задачки по Дейтелю, и вот застрял на этой: Написать программу, которая вставляет 25 случайных целых значений от 0 до 100 в упорядоченный односвязный список. Также нужно, чтобы программа вычисляла сумму чисел и среднее значение. Все сводится к тому, что либо список не печатается,либо срабатывает "бесконечный цикл", либо печатается первое произвольное число, а затем программа крашится с ошибкой segmentation fault. Проверил на дебаггере и вышло, что ругается именно на распечатку списка. В чем может быть ошибка? По указателям вроде бы все нормально(перепроверил раз 100). Да и в порядке вроде бы ничего не напутал. Ко второй части задания пока не приступал, поэтому кейс 2 пока что не задействован.
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. typedef struct numbers{
  6. int value;
  7. struct numbers *next;
  8. }Num;
  9. void push(Num **head, int value);
  10. void print_list(Num *head);
  11. int main(){
  12. int sum, c, i, item;
  13. float mid;
  14. Num *head = NULL;
  15. srand(time(NULL));
  16. system("cls");
  17. printf("Choose one of the options:\n"
  18. "1) View list\n"
  19. "2) Find sum and middle value of the current list\n"
  20. "3) Exit\n");
  21. c = getchar();
  22. while(c!=3){
  23. switch(c){
  24. case '1':
  25. while(i<=25){
  26. item = rand()%100;
  27. push(&head, item);
  28. i++;
  29. }
  30. print_list(head);
  31. break;
  32. case '2':
  33. //print_res(sum, mid);
  34. break;
  35. case '3':
  36. printf("See you later!\n");
  37. exit(EXIT_SUCCESS);
  38. }
  39. }
  40. return 0;
  41. }
  42. void push(Num **head, int value){
  43. Num *tmp = (Num*) malloc(sizeof(Num));
  44. tmp->value = value;
  45. tmp->next = (*head);
  46. (*head) = tmp;
  47. }
  48. void print_list(Num *head){
  49. while(head){
  50. printf("%d", head->value);
  51. head=head->next;
  52. }
  53. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. typedef struct _list {
  7.     struct _list* next;
  8.     int val;
  9. } slist;
  10.  
  11. int  slist_add(slist** lst, int val);
  12. void slist_print(FILE* _out, const slist* p);
  13. void slist_clear(slist* lst);
  14.  
  15. int main(void){
  16.     int    i, n, s;
  17.     slist* p, *lst = NULL;
  18.    
  19.     for(i = 0; i < 25; ++i)
  20.         slist_add(&lst, rand() % 101);
  21.  
  22.     slist_print(stdout, lst);
  23.  
  24.     n = s = 0;
  25.     for(p = lst; p != NULL; p = p->next){
  26.         s += p->val;
  27.         ++n;
  28.     }
  29.     printf("sum: %d\navg: %lg\n", s, (double)s / n);
  30.     return 0;
  31. }
  32.  
  33. int slist_add(slist** lst, int val){
  34.     slist* p, *x = *lst, *y = *lst;
  35.     while((y != NULL) && (y->val < val)){
  36.         x = y;
  37.         y = y->next;
  38.     }
  39.  
  40.     p = (slist*)malloc(sizeof(slist));
  41.     if(p == NULL)
  42.         return 0;
  43.  
  44.     p->val = val;
  45.  
  46.     if(y == *lst){
  47.         p->next = *lst;
  48.         *lst = p;
  49.     } else {
  50.         x->next = p;
  51.         p->next = y;
  52.     }
  53.     return 1;
  54. }
  55.  
  56. void slist_print(FILE* _out, const slist* p){
  57.     for(; p != NULL; p = p->next)
  58.         fprintf(_out, "%d ", p->val);
  59.     fputc('\n', _out);
  60. }
  61.  
  62. void slist_clear(slist* lst){
  63.     slist* t;
  64.     while(lst != NULL){
  65.         t   = lst;
  66.         lst = lst->next;
  67.         free(t);
  68.     }
  69. }

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

  1. Включаем необходимые заголовочные файлы: , , .
  2. Определяем структуру для представления односвязного списка: typedef struct _list { struct _list* next; int val; } slist;
  3. Создаём функции для работы со списком: int slist_add(slist* lst, int val); - добавление элемента в список; void slist_print(FILE _out, const slist p); - вывод списка на экран; void slist_clear(slist lst); - очистка списка.
  4. В функции main создаём список и заполняем его 25 элементами с помощью функции slist_add.
  5. Выводим список на экран с помощью функции slist_print.
  6. Вычисляем сумму и среднее значение элементов списка.
  7. Свободная память освобождается автоматически при завершении работы программы.

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


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

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

12   голосов , оценка 3.667 из 5

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

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

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