Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
#1

Удаление положительных элементов очереди - C++

10.07.2010, 13:45. Просмотров 2997. Ответов 14
Метки нет (Все метки)

Нужно написать программу для удаления положительных элементов очереди
ВВод очереди осуществляется так:
C++
1
2
3
4
5
6
7
8
9
10
void vvod_ochered(int mas[],int *kol,int *end/*,int *start*/)
{
    if((*kol)==N){
    printf("\nOchered zapolnena!\n");}
    else{   
    printf("\nVvedite element ocheredi:");
    scanf("%d",&mas[(*end)]);
    (*kol)++;
    (*end)++;}
}
Вот моя функция удаления:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void del_ochered(int mas[],int *kol,int *start)
{
  if((*kol)==0)
  {
     printf("\n0 elementov v ocheredi!\n");
    }
    else
    {
    printf("Delete element %d",mas[(*start)]);
    (*start)++;
    (*kol)--;
    }
}
Но она немного нето удаляет незнаю как прикрутить туда удаления положительных эл-тов
Подскажите что надо дописать мне
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2010, 13:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление положительных элементов очереди (C++):

Удаление всех элементов из динамической очереди - C++
Покажите пожалуйста пример удаления.

Как происходит удаление элементов из очереди? - C++
Объясните пожалуйста как происходит удаление элементов из очереди!! Допустим есть статическая очередь из 10 элементов. Как их удалить? как...

Создание очереди и удаление элемента очереди по усмотрению пользователя - C++
Вот код он создает очередь и должен удалить элемент очереди по усмотрению пользователя проблема заключается в том что при попытки удалить...

Создание очереди чисел (умножение элементов, добавление и удаление, проверка значений) - C++
Здравствуйте уважаемые форумчане... Тут такое дело, я пишу контрольную и задание меня смущает, так что прошу помощи! Пожалуйста, если можно...

Поиск максимального и минимального элемента в очереди, удаление элементов между максимальным и минимальным - C++
Задача следующая: написать функцию, которая ищет максимальный и минимальный элементы в очереди и удаляет элементы, находящиеся между ними....

Разработать программу формирования очереди, содержащей целые числа, и упорядочивания по возрастанию элементов в этой очереди. - C++
Доброе всем время суток! Помогите пожалуйста! Разработать программу формирования очереди, содержащей целые числа, и упорядочивания по...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
10.07.2010, 13:58 #2
Как-то не сильно на очередь похоже. Это преподаватель заставил реализовывать таким образом?
0
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 14:02  [ТС] #3
Цитата Сообщение от Nameless One Посмотреть сообщение
Как-то не сильно на очередь похоже. Это преподаватель заставил реализовывать таким образом?
Нет,я сам так начал делать??Если надо,могу написать как задание полностью стоит
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
10.07.2010, 14:09 #4
Давай
0
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 15:39  [ТС] #5
Цитата Сообщение от Nameless One Посмотреть сообщение
Давай
Вот так полностью звучит задача Согласно заданному варианту разработать алгоритм решения задач обработки динамических структур и запрограммировать его на языке Си.Для каждого задания необходимо написать функцию создания структуры(create()),добавления элемента(add()),удаления всех положительных элементов(delete()) и поэлементной печати структуры.Для реализации структур очередь и стек изпользовать динамические списки
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
10.07.2010, 15:47 #6
Цитата Сообщение от Prosroma Посмотреть сообщение
динамические списки
Вот это и есть ключевое слово. Тебе нужна очередь, реализованная в виде связного линейного списка. Пользуйся форумом, где-то здесь подобная тема уже была.
0
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 16:05  [ТС] #7
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот это и есть ключевое слово. Тебе нужна очередь, реализованная в виде связного линейного списка. Пользуйся форумом, где-то здесь подобная тема уже была.
Спасибо,нашел такую же задачу как у меня Но вот проблема,нужно этот код переделать под себя,но как
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <limits.h>
 
typedef struct NODE {
        long val;
        struct NODE * next;
} node_t;
 
node_t * new_node(long val, node_t * last){
        node_t * n;
        if ( ( n = (node_t*)malloc(sizeof(node_t)) ) == NULL )
                return NULL;
        n->val = val;
        n->next = NULL;
        if ( last )
                last->next = n;
        return n;
}
 
int insert_after(node_t * prev, long val){
        node_t * n;
        if ( ! prev )
                return -1;
        if ( ( n = (node_t*)malloc(sizeof(node_t)) ) == NULL )
                return -1;
        n->val = val;
        n->next = prev->next;
        prev->next = n;
        return 0;
}
 
/* возвращает указатель на структуру, после которой не получилось добавить элемент,
   или NULL если ошибок небыло */
node_t * add_abs(node_t * n){
        node_t * a;
        while ( n ){
                if ( n->val < 0 ){
                        if ( insert_after(n, n->val * -1) )
                                break;
                }
                n = n->next;
        }
        return n;
}
 
void print_nodes(const node_t * n, int width){
        while ( n ){
                printf("%*ld\n", width, n->val);
                n = n->next;
        }
}
 
void delete_nodes(node_t * n){
        node_t * t;
        while ( n ){
                t = n->next;
                free(n);
                n = t;
        }
}
 
/* возвращает 0 если в *pNum удалось поместить число,
   1 если ввод закончен, и -1 в случае ошибки */
int get_num(long * pNum){
        static char buf[BUFSIZ] = { 0 };
        char * tail;
        printf("Number: ");
        if ( ! fgets(buf, BUFSIZ, stdin) ){
                fprintf(stderr, "Can't get string.\n");
                return -1;
        }
        if ( *buf == '\n' )
                return 1;
        if ( ! isdigit(*buf) && *buf != '-' && ! isspace(*buf) ){
                fprintf(stderr, "Not a number.\n");
                return -1;
        }
        *pNum = strtol(buf, &tail, 10);
        if ( errno == ERANGE ){
                if ( *pNum == LONG_MAX )
                        fprintf(stderr, "Too big.\n");
                else
                        fprintf(stderr, "Too small.\n");
                errno = 0;
                return -1;
        }
        if ( ! isspace(*tail) ){
                fprintf(stderr, "Only digits allowed.\n");
                return -1;
        }
        return 0;
}
 
/* Описать функцию, которая за каждым отрицательным элементом очереди вставляет элемент,
        содержащий его значение по модулю. */
 
#define WIDTH 10
 
int main(void){
        node_t * first, * last;
        long val;
        int ret;
 
        first = last = NULL;
        printf("Enter some numbers. Empty string - finish.\n");
        while ( 1 ){
                if ( ! ( ret = get_num(&val) ) ){
                        if ( ( last = new_node(val, last) ) == NULL ){
                                fprintf(stderr, "Memory or another error.\n");
                                if ( first )
                                        delete_nodes(first);
                                exit(EXIT_FAILURE);
                        }
                        if ( ! first )
                                first = last;
                }
                else if ( ret == -1 )
                        fprintf(stderr, "Wrong number! Try another one...\n");
                else
                        break;
        }
 
        if ( ! first ){
                fprintf(stderr, "No values in list.\n");
                exit(EXIT_FAILURE);
        }
 
        printf("\nEntered values:\n");
        print_nodes(first, WIDTH);
 
        if ( last = add_abs(first) ){
                fprintf(stderr, "Can't add absolute value after %ld\n", last->val);
                delete_nodes(first);
                exit(EXIT_FAILURE);
        }
 
        printf("\nValues with added absolute if needed:\n");
        print_nodes(first, WIDTH);
 
        delete_nodes(first);
        exit(EXIT_SUCCESS);
}
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
10.07.2010, 16:53 #8
Возьми за основу функцию delete_nodes и добавь в нее проверку условия.
0
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 17:01  [ТС] #9
Цитата Сообщение от Nameless One Посмотреть сообщение
Возьми за основу функцию delete_nodes и добавь в нее проверку условия.
Можеш помочь,а то я дуб дубом
0
easybudda
Модератор
Эксперт CЭксперт С++
9627 / 5575 / 947
Регистрация: 25.07.2009
Сообщений: 10,710
10.07.2010, 17:04 #10
Цитата Сообщение от Prosroma Посмотреть сообщение
нашел такую же задачу как у меня
Ну вообще говоря, задача совсем не такая же... Если нужно удалять элементы из середины, лучше использовать двухсвязные списки, иначе код будет не эффективным - прийдётся каждый раз по всему списку искать элемент, у которого next будет на удаляемый указывать. Мало того, нужно будет проверять - не первый ли в списке элемент, который удалить нужно, если да, не забыть указатель на начало списка подкорректировать... Ну или сразу, если первый елемент удалять не нужно, проверять, что тот, который после него находится, содержит... Короче, не так всё просто...
0
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 17:09  [ТС] #11
Цитата Сообщение от easybudda Посмотреть сообщение
Ну вообще говоря, задача совсем не такая же... Если нужно удалять элементы из середины, лучше использовать двухсвязные списки, иначе код будет не эффективным - прийдётся каждый раз по всему списку искать элемент, у которого next будет на удаляемый указывать. Мало того, нужно будет проверять - не первый ли в списке элемент, который удалить нужно, если да, не забыть указатель на начало списка подкорректировать...
Нужно просто просматривать очередь и удалять все положительные элементы,а потом вывести полученную очередь Можеш помочь,а то я просто не понимаю эту тему
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
10.07.2010, 17:09 #12
А мне кажется, что как раз лучше будет использовать односвязные списки, т.к. все равно нужно будет перебирать все элементы списка.
0
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 17:56  [ТС] #13
Помогите
0
easybudda
Модератор
Эксперт CЭксперт С++
9627 / 5575 / 947
Регистрация: 25.07.2009
Сообщений: 10,710
10.07.2010, 18:30 #14
Цитата Сообщение от Prosroma Посмотреть сообщение
Можеш помочь
Я столько всего могу - временами самому страшно
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#include <stdlib.h>
 
typedef struct NODE {
    int val;
    struct NODE * prev;
    struct NODE * next;
} node_t;
 
node_t * new_node(int val){
    node_t * n;
    if ( ( n = (node_t*)malloc(sizeof(node_t)) ) == NULL )
        return NULL;
    n->val = val;
    n->prev = NULL;
    n->next = NULL;
    return n;
}
 
/* удаляет элемент, возвращает указатель на следующий */
node_t * del_node (node_t * n){
    node_t * ret = n->next;
    if ( n->prev )
        n->prev->next = n->next;
    if ( n->next )
        n->next->prev = n->prev;
    free(n);
    return ret;
}
 
void clear_list(node_t * n){
    while ( n = del_node(n) )
        ;
}
 
/* удаляет элементы, соответствующие условию, возвращает указатель на первый элемент обработанного списка */
node_t * remove_if(node_t * n, int (*test_func)(const node_t * nodeToTest)){
    node_t * first = n;
    while ( first && test_func(first) )
        first = del_node(first);
    if ( ! first )
        return NULL;
    for ( n = first->next; n != NULL; ){
        if ( test_func(n) )
            n = del_node(n);
        else
            n = n->next;
    }
    return first;
}
 
int is_positive(const node_t * n){
    return ( n->val > 0 );
}
 
node_t * create_list(void){
    node_t * first, * last, * current;
    static char buf[32] = { 0 };
    
    first = last = NULL;
    
    printf("Enter some numbers (empty string - finish):\n");
    while ( fgets(buf, 32, stdin) ) {
        if ( *buf == '\n' )
            break;
        if ( ( current = new_node(atoi(buf)) ) == NULL ){
            if ( first )
                clear_list(first);
            return NULL;
        }
        if ( ! first ){
            first = current;
            last = first;
        }
        else {
            current->prev = last;
            last->next = current;
            last = current;
        }
    }
    return first;
}
 
void print_list(const node_t * n){
    while ( n ){
        printf("%d\n", n->val);
        n = n->next;
    }
}
 
int main(void){
    node_t * list;
    
    if ( ( list = create_list() ) == NULL ){
        fprintf(stderr, "Can't create list!\n");
        exit(EXIT_FAILURE);
    }
    printf("You have entered:\n");
    print_list(list);
 
    printf("Without positive elements:\n");
    if ( ( list = remove_if(list, is_positive) ) == NULL ){
        printf("No elements in list!\n");
    }
    else {
        print_list(list);
        clear_list(list);
    }
    
    exit(EXIT_SUCCESS);
}
Цитата Сообщение от Nameless One Посмотреть сообщение
все равно нужно будет перебирать все элементы списка.
Нужно будет - однозначно! Вопрос в том: сколько раз это прийдётся сделать...
1
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 18:41  [ТС] #15
Цитата Сообщение от 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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#include <stdlib.h>
 
typedef struct NODE {
    int val;
    struct NODE * prev;
    struct NODE * next;
} node_t;
 
node_t * new_node(int val){
    node_t * n;
    if ( ( n = (node_t*)malloc(sizeof(node_t)) ) == NULL )
        return NULL;
    n->val = val;
    n->prev = NULL;
    n->next = NULL;
    return n;
}
 
/* удаляет элемент, возвращает указатель на следующий */
node_t * del_node (node_t * n){
    node_t * ret = n->next;
    if ( n->prev )
        n->prev->next = n->next;
    if ( n->next )
        n->next->prev = n->prev;
    free(n);
    return ret;
}
 
void clear_list(node_t * n){
    while ( n = del_node(n) )
        ;
}
 
/* удаляет элементы, соответствующие условию, возвращает указатель на первый элемент обработанного списка */
node_t * remove_if(node_t * n, int (*test_func)(const node_t * nodeToTest)){
    node_t * first = n;
    while ( first && test_func(first) )
        first = del_node(first);
    if ( ! first )
        return NULL;
    for ( n = first->next; n != NULL; ){
        if ( test_func(n) )
            n = del_node(n);
        else
            n = n->next;
    }
    return first;
}
 
int is_positive(const node_t * n){
    return ( n->val > 0 );
}
 
node_t * create_list(void){
    node_t * first, * last, * current;
    static char buf[32] = { 0 };
    
    first = last = NULL;
    
    printf("Enter some numbers (empty string - finish):\n");
    while ( fgets(buf, 32, stdin) ) {
        if ( *buf == '\n' )
            break;
        if ( ( current = new_node(atoi(buf)) ) == NULL ){
            if ( first )
                clear_list(first);
            return NULL;
        }
        if ( ! first ){
            first = current;
            last = first;
        }
        else {
            current->prev = last;
            last->next = current;
            last = current;
        }
    }
    return first;
}
 
void print_list(const node_t * n){
    while ( n ){
        printf("%d\n", n->val);
        n = n->next;
    }
}
 
int main(void){
    node_t * list;
    
    if ( ( list = create_list() ) == NULL ){
        fprintf(stderr, "Can't create list!\n");
        exit(EXIT_FAILURE);
    }
    printf("You have entered:\n");
    print_list(list);
 
    printf("Without positive elements:\n");
    if ( ( list = remove_if(list, is_positive) ) == NULL ){
        printf("No elements in list!\n");
    }
    else {
        print_list(list);
        clear_list(list);
    }
    
    exit(EXIT_SUCCESS);
}
Нужно будет - однозначно! Вопрос в том: сколько раз это прийдётся сделать...
Спасибо,все работает
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2010, 18:41
Привет! Вот еще темы с ответами:

queue удаление из очереди - C++
Создать однонаправленную очередь с числами в диапазоне от –50 до +50. Удалить из очереди все элементы, расположенные до минимального ...

Удаление элемента из очереди - C++
У меня в функции удаления элемента, удаляется элемент тот, который ввели последним, а надо первый элемент (тот что ввели первым) Как...

Удаление элемента из очереди - C++
Здравствуйте, проблема с очередями, совсем их не понимаю, перечитал много статей все равно не доходит.( Задание: Удалить каждый второй...

Удаление звеньев созданный по принципу очереди с++ - C++
Программа должна должна удалять звенья в которых Elem нечётный, где ошибка? Просто не работает и не погу понять почему ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.07.2010, 18:41
Ответ Создать тему
Опции темы

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