Не работает вывод заполненного односвязного списка - 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);
    }
}

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

  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
Похожие ответы