Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
GodSaveUs
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 4
1

Не работает вывод заполненного односвязного списка

11.08.2016, 20:22. Просмотров 885. Ответов 3

Пробую решать задачки по Дейтелю, и вот застрял на этой: Написать программу, которая вставляет 25 случайных целых значений от 0 до 100 в упорядоченный односвязный список. Также нужно, чтобы программа вычисляла сумму чисел и среднее значение.
Все сводится к тому, что либо список не печатается,либо срабатывает "бесконечный цикл", либо печатается первое произвольное число, а затем программа крашится с ошибкой segmentation fault. Проверил на дебаггере и вышло, что ругается именно на распечатку списка. В чем может быть ошибка? По указателям вроде бы все нормально(перепроверил раз 100). Да и в порядке вроде бы ничего не напутал. Ко второй части задания пока не приступал, поэтому кейс 2 пока что не задействован.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#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;
    }
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2016, 20:22
Ответы с готовыми решениями:

Вывод односвязного динамического списка
Размер структуры cell - 20 байт. (см. программу ниже). Т.е. при выделении памяти под новый элемент...

Не работает сортировка односвязного списка с считыванием из файла и выводом в файл
Написать программу, которая считывает из файла разделенные пробелом числа, игнорируя другие...

Сортировка односвязного списка
Добрый день. Проблема, не знаю, с чем связана, сортирует нормально, все работает, но иногда...

Реализация односвязного списка
Здравствуйте! Программа падает, судя по тестам, после команды list_clear, которая очищает все...

Сортировка односвязного списка
Всем доброго времени суток! Пишу курсавик по программированию, всё написал, осталась только одна...

3
Denis_90_90
0 / 0 / 1
Регистрация: 10.08.2016
Сообщений: 4
11.08.2016, 21:02 2
Мой односвязный список. Не могу сейчас присесть и заняться твоим заданием, поэтому скину свой код. Может, если доживем - сделаю и твое. У меня было задание: вывести из файла данные, занести в список (там же они и упорядочиваются по возрастанию) и вывести на экран и в файл.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
 
struct Node{
    int data;
    struct Node *next;
};
 
struct Node *create (){
    return NULL;
}
 
void print(struct Node *list){
    struct Node *p = NULL;
    FILE *pnewfile;
    pnewfile = fopen("newnums.txt", "w");
    printf("\nNew data: \n\n\t");
    if(pnewfile != NULL){
        for (p=list; p!=NULL; p=p->next){
            fprintf(pnewfile, "%d\n",p->data);
            printf("%d\n\t", p->data);
        }
    }
    fclose(pnewfile);
    free(p);
    if(p==NULL){
        printf("\n\nGood\n");
    }
    printf("\n");
}
 
int is_empty(struct Node *list){
    return list == NULL;
}
 
void push (struct Node **list, int x){
    
    struct Node *node = malloc(sizeof(struct Node));
    
    struct Node *pprev;
    struct Node *pcurrent;
    
    if(node != NULL){
        node->data = x;
        node->next = NULL;
        
        pprev = NULL;
        pcurrent = *list;
        
        while(pcurrent != NULL && x > pcurrent->data){
            pprev = pcurrent;
            pcurrent = pcurrent->next;
        }
        
        if(pprev == NULL){
            node->next = *list;
            *list = node;
        }
        else{
            pprev->next = node;
            node->next = pcurrent;
        }
        }
        else{
            printf("%c not inserted. No memory available.\n", x);
        }
    }
int main(){
    int i;
    int nums[15];
    struct Node *list = create();
    FILE *pfile;
    pfile = fopen("nums.txt", "r");
    printf("Old data: \n\n\t");
    if(pfile != NULL){
        for(i=0; i<15,!feof(pfile); i++){
            fscanf(pfile,"%d",&nums[i]);
            push(&list,nums[i]);
            printf("%d\n\t",nums[i]);
        }
    }
    print(list);
    fclose(pfile);
    return 0;
}
0
Геомеханик
798 / 602 / 939
Регистрация: 26.06.2015
Сообщений: 1,409
11.08.2016, 21:03 3
Лучший ответ Сообщение было отмечено GodSaveUs как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#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
GodSaveUs
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 4
11.08.2016, 21:29  [ТС] 4
У меня было задание: вывести из файла данные, занести в список (там же они и упорядочиваются по возрастанию) и вывести на экран и в файл.
Прикол в том, что как из файла выводить я уже знаю. А вот как в чистом виде и на консоль, да еще и с одним указателем? Да, можно было бы использовать несколько. Но хочу попробовать с одним. Тем более в файле можно задать, чтобы выводился до конца файла. А тут вот загвоздочка... Как ни пробовал - ошибка, либо отсутствие результата. Глянь, по-возможности, пожалуйста. Слава Деннису Ритчи мне не горит.
0
11.08.2016, 21:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2016, 21:29

Создание односвязного списка
Доброй ночи. Пытался сделать эти задания, но во время написания впервые столкнулся с неоднозначными...

Сортировка динамического односвязного списка
Здравствуйте. Буду признателен за помощь в написании функции сортировки односвязного списка. ...

Удаление элемента из односвязного списка
помогите, пжлста, уже мучаюсь несколько дней, нужна незамысловатая функция,которая удаляет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru