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