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