Не работает вывод заполненного односвязного списка - C (СИ)
Формулировка задачи:
Пробую решать задачки по Дейтелю, и вот застрял на этой: Написать программу, которая вставляет 25 случайных целых значений от 0 до 100 в упорядоченный односвязный список. Также нужно, чтобы программа вычисляла сумму чисел и среднее значение.
Все сводится к тому, что либо список не печатается,либо срабатывает "бесконечный цикл", либо печатается первое произвольное число, а затем программа крашится с ошибкой segmentation fault. Проверил на дебаггере и вышло, что ругается именно на распечатку списка. В чем может быть ошибка? По указателям вроде бы все нормально(перепроверил раз 100). Да и в порядке вроде бы ничего не напутал. Ко второй части задания пока не приступал, поэтому кейс 2 пока что не задействован.
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct numbers{ int value; struct numbers *next; }Num; void push(Num **head, int value); void print_list(Num *head); int main(){ int sum, c, i, item; float mid; Num *head = NULL; srand(time(NULL)); system("cls"); printf("Choose one of the options:\n" "1) View list\n" "2) Find sum and middle value of the current list\n" "3) Exit\n"); c = getchar(); while(c!=3){ switch(c){ case '1': while(i<=25){ item = rand()%100; push(&head, item); i++; } print_list(head); break; case '2': //print_res(sum, mid); break; case '3': printf("See you later!\n"); exit(EXIT_SUCCESS); } } return 0; } void push(Num **head, int value){ Num *tmp = (Num*) malloc(sizeof(Num)); tmp->value = value; tmp->next = (*head); (*head) = tmp; } void print_list(Num *head){ while(head){ printf("%d", head->value); head=head->next; } }
Решение задачи: «Не работает вывод заполненного односвязного списка»
textual
Листинг программы
#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct _list { struct _list* next; int val; } slist; int slist_add(slist** lst, int val); void slist_print(FILE* _out, const slist* p); void slist_clear(slist* lst); int main(void){ int i, n, s; slist* p, *lst = NULL; for(i = 0; i < 25; ++i) slist_add(&lst, rand() % 101); slist_print(stdout, lst); n = s = 0; for(p = lst; p != NULL; p = p->next){ s += p->val; ++n; } printf("sum: %d\navg: %lg\n", s, (double)s / n); return 0; } int slist_add(slist** lst, int val){ slist* p, *x = *lst, *y = *lst; while((y != NULL) && (y->val < val)){ x = y; y = y->next; } p = (slist*)malloc(sizeof(slist)); if(p == NULL) return 0; p->val = val; if(y == *lst){ p->next = *lst; *lst = p; } else { x->next = p; p->next = y; } return 1; } void slist_print(FILE* _out, const slist* p){ for(; p != NULL; p = p->next) fprintf(_out, "%d ", p->val); fputc('\n', _out); } void slist_clear(slist* lst){ slist* t; while(lst != NULL){ t = lst; lst = lst->next; free(t); } }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
, , . - Определяем структуру для представления односвязного списка: typedef struct _list { struct _list* next; int val; } slist;
- Создаём функции для работы со списком: int slist_add(slist* lst, int val); - добавление элемента в список; void slist_print(FILE _out, const slist p); - вывод списка на экран; void slist_clear(slist lst); - очистка списка.
- В функции main создаём список и заполняем его 25 элементами с помощью функции slist_add.
- Выводим список на экран с помощью функции slist_print.
- Вычисляем сумму и среднее значение элементов списка.
- Свободная память освобождается автоматически при завершении работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д