Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 30.06.2017
Сообщений: 10
1

Создать список из целых чисел. Подсчитать количество отрицательных элементов, создав из них новый список

01.07.2017, 07:08. Просмотров 3772. Ответов 17
Метки нет (Все метки)

Создать список из целых чисел. Подсчитать количество отрицательных элементов, создав из них новый список. Срочно надо, курсач сдавать через 3 часа. Есть готовое решение, но оно не работает, а разбираться некогда. Помогите пожалуйста!

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
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
 
struct stack  //описание стека stack
{int inf;  stack *next;};
stack *init_stack() //инициализация стека
{return NULL;}
void push(stack *&s,int item) //добавление элемента в стек. 
{
stack *r;
r=(stack*)malloc(sizeof(stack));
 
r->inf=item;r->next=s;s=r;
}
int pop(stack *&s) //выбор верхнего элемента из стека
{
stack *r=s;
int i=r->inf;s=r->next;
free(r);
return i;
}
int peek(stack *s) //просмотр верхнего элемента стека
{
return s->inf;
}
int empty_stack(stack *s) //определение пустоты стека
{return(s)?0:1;}
 
int main()
{
    setlocale(0,"Russian");
    printf("\nСоздать список из целых чисел. Подсчитать количество отрицательных элементов,\nсоздав из них новый список.\n\n");
    FILE *h=fopen("Stek_in.txt", "r");
    FILE *s=fopen("Stek_out.txt", "w");
    int i, k=0;
    stack *head=init_stack();
    stack *head1=init_stack();
 
    while (!feof(h))
    {
        fscanf(h, "%d", &i);
        push (head, i);
    }
    while (!empty_stack(head))
    {
        i=pop(head);
        if (i<0)
        {
            push(head1, i); k++;
            
        }
    }
    while (!empty_stack(head1))
    {
        i=pop(head1);
        fprintf(s,"%d ", i); }
    printf("Файл записан %d", k);
    fcloseall();
    getch();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2017, 07:08
Ответы с готовыми решениями:

Создать список целых чисел. Создать новый список, записав в него отрицательные элементы
Создать список целых чисел. Создать новый список, записав в него отрицательные элементы.(задачу...

Создать однонаправленный список. Подсчитать количество отрицательных элементов списка
Создать однонаправленный список, элементы списка - целые числа, признак окончания ввода элементов -...

Список: Подсчитать количество всех отрицательных и положительных чисел...
Пользователь вводит список чисел, а программа ищет количество всех отрицательных и положительных...

Как подсчитать количество одинаковых элементов в списке и составить из них список?
Вопросы: (#1) Как подсчитать количество повторяющихся (одинаковых) элементов списка? (#2)Как...

17
Заклинатель змей
576 / 477 / 207
Регистрация: 30.04.2016
Сообщений: 2,328
01.07.2017, 10:36 2
Ivan12199,

Оффтоп:
Курсач
@
Пишете за 3 часа до сдачи

Если это ваше "готовое решение", то оно не подходит, т.к описывает стек , а не список (кстати, список нужен одно- или двухнаправленный?)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10897 / 6813 / 1623
Регистрация: 25.07.2009
Сообщений: 12,518
01.07.2017, 12:14 3
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
#include <stdio.h>
#include <glib.h>
 
int main(void) {
    GSList * all = NULL, * neg = NULL, * iter;
    int n;
    
    printf ("Enter some numbers and any other symbol when done...\n");
    while ( printf("> ") && scanf("%d", &n) == 1 )
        all = g_slist_prepend(all, GINT_TO_POINTER(n));
    
    for ( iter = all; iter; iter = g_slist_next(iter) ) {
        n = GPOINTER_TO_INT(iter->data);
        if ( n < 0 )
            neg = g_slist_prepend(neg, GINT_TO_POINTER(n));
    }
    
    printf("%d negative numbers.\n", g_slist_length(neg));
    for ( iter = neg; iter; iter = g_slist_next(iter) )
        printf("%d\n", GPOINTER_TO_INT(iter->data));
    
    g_slist_free(all);
    g_slist_free(neg);
    
    return 0;
}
Код
andrew@andrew0716 ~/c/glib
$ gcc negative_elements.c `pkg-config --cflags --libs glib-2.0`

andrew@andrew0716 ~/c/glib
$ ./a
Enter some numbers and any other symbol when done...
> 45
> 54
> -3
> 1
> -2
> q
2 negative numbers.
-3
-2

andrew@andrew0716 ~/c/glib
$ ./a
Enter some numbers and any other symbol when done...
> 3
> 2
> 1 
> q
0 negative numbers.

andrew@andrew0716 ~/c/glib
И не благодари
1
891 / 640 / 215
Регистрация: 30.06.2015
Сообщений: 3,521
Записей в блоге: 34
01.07.2017, 20:12 4
Цитата Сообщение от Ivan12199 Посмотреть сообщение
Подсчитать количество отрицательных элементов, создав из них новый список. Срочно надо, курсач сдавать через 3 часа.
Конечно, 3 часа уже пролетели, и не актуально, но вот вариант с использованием стандартных библиотек:
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
#include <stdio.h>
#include <stdlib.h>
#define NUMELEM 5
typedef struct mylist
{
    int val;
    struct mylist *next;
}mylist;
 
mylist *new_node(int v)
{
    mylist *new;
    if((new=(mylist*)malloc(sizeof(mylist)))==NULL)return NULL;
    new->val=v;
    new->next=NULL;
    return new;
}
mylist *add_front(mylist *p, mylist *n)
{
    n->next=p;
    return n;
}
void print_mylist(mylist *l)
{
    for(; l!=NULL; l=l->next)
    {
        printf("%d ", l->val);
    }
}
void free_mylist(mylist *l)
{
    mylist * n;
    for(; l!=NULL; l=n)
    {
        n=l->next;
        free(l);
    }
}
int main(void) 
{
    mylist* a=NULL, *b=NULL;
    int e=0, c=0;
    for(int i=1; i<=NUMELEM; ++i)
    {
        scanf("%d", &e);
        a=add_front(a, new_node(e));
        if(e<0)b=add_front(b, new_node(e));
    }
    print_mylist(a);
    puts("");
    if(b!=NULL)print_mylist(b);
    free_mylist(a);
    free_mylist(b);
    return 0;
}
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 32
18.12.2018, 20:24 5
@easybudda А как можно сделать,чтобы этот список из отрицательных эл-ов выводился в порядке возрастания , -3 -2 -1 ...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10897 / 6813 / 1623
Регистрация: 25.07.2009
Сообщений: 12,518
18.12.2018, 20:37 6
Цитата Сообщение от xraze666 Посмотреть сообщение
А как можно сделать,чтобы этот список из отрицательных эл-ов выводился в порядке возрастания
Кэп подсказывает - отсортировать по возрастанию
https://developer.gnome.org/gl... slist-sort
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 32
18.12.2018, 21:00 7
Добавлено через 12 минут
Цитата Сообщение от easybudda Посмотреть сообщение
Кэп подсказывает - отсортировать по возрастанию
Не подскажешь ,а могу ли я тогда сначала отсортировать всё по возрастанию,а потом все отрицательные как раз и будут в самом начале списка и остается только вывести готовый ответ. Только всё с той же сортировкой,не знаю как ее произвести,могу я скинуть код ,чтобы ты помог?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10897 / 6813 / 1623
Регистрация: 25.07.2009
Сообщений: 12,518
18.12.2018, 22:28 8
xraze666, да могу, наверное. Просто из любопытства: а принципиально, чтобы оно списком было? Массив сортировать как-то проще...
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 32
18.12.2018, 22:34 9
Цитата Сообщение от easybudda Посмотреть сообщение
принципиально, чтобы оно списком было?
Ну от меня требуют по заданию вывести из одного списка,новый с отриц.знач по возрастанию,поэтому думаю,что да. Возможно можно отсортировать по другому,если покрутить как-то цикл,потому что у меня получается сравнить в списке только первый и последующий за ним элемент,а если как-то сравнить первый с остальными и из остальных будет тоже отрицательный сравнить их и вывести ,что меньше,но это как обычно легко и понятно только на словах) Вот код , у меня если запустить , то выводит просто список из отрицательных эл-ов
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
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
typedef struct List
{
    int info;
    struct List* next;
} List;
 
List *First, *Last;
 
void push(int inf)
{
    struct List* el;
    el = (struct List*)malloc(sizeof(struct List));
    if (el == NULL)
    {
        printf("Не удалось выделить память под элемент списка.\n");
        return;
    }
 
    el->info = inf;
    el->next = NULL;
 
    if (First == NULL)
        First = Last = el;
    else
    {
        Last->next = el;
        Last = Last->next;
    }
}
 
int main(void)
{
    int inf;
    int k=0, i=0;
    List *el, *tmp;
 
    setlocale(LC_ALL, "Russian");
 
    First = Last = NULL;
 
    printf("Введите элементы списка (окончание ввода -- любой символ, кроме цифры):\n");
    while (scanf("%d", &inf) != 0)
        push(inf);
 
    
    printf("Все отрицательные эл-ты:");
    for (el = First; el != NULL;el=el->next) {
        if (el->info < 0) 
                printf("%d ", el->info);
        }
    
    
    for (el = First; el != NULL;)
    {
        tmp = el;
        el = el->next;
        free(tmp);
    }
    system("pause");
    return 0;
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10897 / 6813 / 1623
Регистрация: 25.07.2009
Сообщений: 12,518
18.12.2018, 23:36 10
Цитата Сообщение от xraze666 Посмотреть сообщение
List *First, *Last;
Это учат так - указатели глобальными переменными делать? При том, что в программе два листа нужны...
В любом случае:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void sort(List * list) {
    for ( ; list; list = list->next ) {
        List * min = list, * next = list->next;
 
        for ( ; next; next = next->next ) 
            if ( next->info < min->info )
                min = next;
 
        if ( min != list ) {
            int tmp = list->info;
            list->info = min->info;
            min->info = tmp;
        }
    }
}
Не проверял.
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 32
19.12.2018, 00:09 11
Цитата Сообщение от easybudda Посмотреть сообщение
Это учат так
Да,взял из примеров ,создания списка, преподавателей. Сейчас попробую
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 32
19.12.2018, 00:21 12
Цитата Сообщение от easybudda Посмотреть сообщение
Это учат так - указатели глобальными переменными делать?
Да,брал пример ,создания списка,у преподавателей .
Всё сортируется хорошо,большое спасибо. ТОлько появилась небольшая проблема в конце появляются мусорные значения почему-то.
Сделал так
C
1
2
3
4
for (el = First; el != NULL; el = el->next) {
        sort(el);
        printf("%d", el->info);
    }
0
Миниатюры
Создать список из целых чисел. Подсчитать количество отрицательных элементов, создав из них новый список  
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10897 / 6813 / 1623
Регистрация: 25.07.2009
Сообщений: 12,518
19.12.2018, 00:25 13
Цитата Сообщение от xraze666 Посмотреть сообщение
Сделал так
А не нужно так делать! В функцию нужно передавать указатель на начало списка, дальше она сама всё сделает. И уже потом в цикле элементы выводить.
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 32
19.12.2018, 00:39 14
Цитата Сообщение от easybudda Посмотреть сообщение
указатель на начало списка
Никак не пойму,указатель на начало списка у меня это First,то есть sort(First) ,если должно быть так и я всё правильно понял,то ничего не меняется. указатели прям какая-то боль.А стоп,кажется разобрался,щас попробую и отпишу

Добавлено через 5 минут
easybudda, Всё,полностью разобрался и подредактировал , большое спасибо тебе!!! А то сортировка массива если была понятна ,то сортировка списка полный лес,буду разбираться и в ней,ещё раз спасибо!
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 32
19.12.2018, 17:35 15
easybudda, Снова здравствуйте,сдавал сегодня работу и как оказалось,выводить отрицательные элементы повозрастанию в Новый Список,но при этом не делая новую структуру и тд,я не совсем понял как это сделать ,и создал новый список и уже через него работал ,сказали так нельзя и слишком много памяти забирает. Подскажи пожалуйста ,как сделать вывод в этот новый список ,не создавая его как я понял . Код дописанный могу скинуть
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10897 / 6813 / 1623
Регистрация: 25.07.2009
Сообщений: 12,518
19.12.2018, 19:11 16
Цитата Сообщение от xraze666 Посмотреть сообщение
выводить отрицательные элементы повозрастанию в Новый Список,но при этом не делая новую структуру и тд,я не совсем понял как это сделать
Я вообще ничего не понял. Как можно создать новый список не создавая его узлов? Единственное, что на ум приходит - в исходном списке переставить элементы так, чтобы сначала шли все положительные, а за ними все отрицательные. Тогда указатель на первый узел с отрицательным значением и будет как бы списком с отрицательными числами. При желании их можно отсортировать. Для сортировки вполне подойдёт функция, которую я выше выложил.
0
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 32
19.12.2018, 19:54 17
easybudda, Извиняюсь,не так написал. Требуется создания нового списка,не трогая исходный. Т.е мы нашли в исходном списке,нужные нам значения и нужно переместить их в новый список,ну а там уже отсортировать не сложно. Чего собственно я прошу помочь сделать,это как создать новый список и поместить в него уже нужные нам значения.
Код на данный момент такой(Считает все отриц эл-ты в порядке возрастания)
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
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
typedef struct List
{
    int info;
    struct List* next;
} List;
 
List *First, *Last;
 
 
void sort(List * list) {
    for (; list; list = list->next) {
        List * min = list, *next = list->next;
 
        for (; next; next = next->next)
            if (next->info < min->info)
                min = next;
 
        if (min != list) {
            int tmp = list->info;
            list->info = min->info;
            min->info = tmp;
        }
    }
}
 
 
void push(int inf)
{
    struct List* el;
    el = (struct List*)malloc(sizeof(struct List));
    if (el == NULL)
    {
        printf("Не удалось выделить память под элемент списка.\n");
        return;
    }
 
    el->info = inf;
    el->next = NULL;
 
    if (First == NULL)
        First = Last = el;
    else
    {
        Last->next = el;
        Last = Last->next;
    }
}
 
int main(void)
{
    int inf;
    List *el, *tmp;
 
    setlocale(LC_ALL, "Russian");
    First = Last = NULL;
 
    printf("Введите элементы списка (окончание ввода -- любой символ, кроме цифры):\n");
    while (scanf("%d", &inf) != 0)
        push(inf);
    printf("\nВесь отсартированный список:");
    for (el = First; el != NULL; el = el->next){
        sort(First);
    printf("%d ", el->info);
}
        
    printf("\nВсе отрицательные эл-ты:");
    for (el = First; el != NULL; el = el->next) 
    {
        if (el->info<0)
            printf("%d ", el->info);
    }
 
    for (el = First; el != NULL;)
    {
        tmp = el;
        el = el->next;
        free(tmp);
    }
    system("pause");
    return 0;
}
Добавлено через 4 минуты
easybudda, Я попытался создать новый список,с новой структурой,но мне надавали по голове,из-за слишком большого сжирания памяти. Нужно создать новый список,но с той же структурой видимо,не "пачкая" ее и исходный список.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10897 / 6813 / 1623
Регистрация: 25.07.2009
Сообщений: 12,518
19.12.2018, 23:15 18

Не по теме:

Цитата Сообщение от xraze666 Посмотреть сообщение
Весь отсартированный список
Страшно представить, что с ним делали...


Цитата Сообщение от xraze666 Посмотреть сообщение
C
1
2
    for (el = First; el != NULL; el = el->next){
        sort(First);
Попробуй объяснить (в первую очередь самому себе), что именно здесь происходит...
А сразу после должно бы грохнуться на
Цитата Сообщение от xraze666 Посмотреть сообщение
C
1
printf("%d ", el->info);
со словами Null pointer exception или вроде того.
И никакого создания нового списка не видно. Из исходного печатаются те, которые меньше 0.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2018, 23:15

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

Подсчитать количество целых чисел, входящих в список только один раз
Подсчитать количество целых чисел, входящих в список только один раз. Список упорядочен по...

Создать список из целых чисел. Перед всеми минимальными элементами вставить новый элемент
Создать список из целых чисел. После всех максимальных элементов вставить новый элемент....

Даны два двумерных массива целых чисел с размерами элементов Подсчитать количество отрицательных элементов в каждом
2 Задание. Даны два двумерных массива целых чисел с размерами (4х5) элементов. Подсчитать...

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


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

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

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