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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 13:45     написать программу для удаления положительных элементов очереди #1
Нужно написать программу для удаления положительных элементов очереди
ВВод очереди осуществляется так:
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)--;
    }
}
Но она немного нето удаляет незнаю как прикрутить туда удаления положительных эл-тов
Подскажите что надо дописать мне
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2010, 13:45     написать программу для удаления положительных элементов очереди
Посмотрите здесь:

C++ Написать программу вычисления суммы положительных элементов в каждом массиве.
C++ Написать программу формирования очереди
C++ Написать программу с использыванием очереди на языке С
Составить программу для подсчета суммы положительных элементов квадратного массива Х C++
C++ Разработать программу формирования очереди, содержащей целые числа, и упорядочивания по возрастанию элементов в этой очереди.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.07.2010, 13:58     написать программу для удаления положительных элементов очереди #2
Как-то не сильно на очередь похоже. Это преподаватель заставил реализовывать таким образом?
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 14:02  [ТС]     написать программу для удаления положительных элементов очереди #3
Цитата Сообщение от Nameless One Посмотреть сообщение
Как-то не сильно на очередь похоже. Это преподаватель заставил реализовывать таким образом?
Нет,я сам так начал делать??Если надо,могу написать как задание полностью стоит
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.07.2010, 14:09     написать программу для удаления положительных элементов очереди #4
Давай
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 15:39  [ТС]     написать программу для удаления положительных элементов очереди #5
Цитата Сообщение от Nameless One Посмотреть сообщение
Давай
Вот так полностью звучит задача Согласно заданному варианту разработать алгоритм решения задач обработки динамических структур и запрограммировать его на языке Си.Для каждого задания необходимо написать функцию создания структуры(create()),добавления элемента(add()),удаления всех положительных элементов(delete()) и поэлементной печати структуры.Для реализации структур очередь и стек изпользовать динамические списки
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.07.2010, 15:47     написать программу для удаления положительных элементов очереди #6
Цитата Сообщение от Prosroma Посмотреть сообщение
динамические списки
Вот это и есть ключевое слово. Тебе нужна очередь, реализованная в виде связного линейного списка. Пользуйся форумом, где-то здесь подобная тема уже была.
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);
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.07.2010, 16:53     написать программу для удаления положительных элементов очереди #8
Возьми за основу функцию delete_nodes и добавь в нее проверку условия.
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 17:01  [ТС]     написать программу для удаления положительных элементов очереди #9
Цитата Сообщение от Nameless One Посмотреть сообщение
Возьми за основу функцию delete_nodes и добавь в нее проверку условия.
Можеш помочь,а то я дуб дубом
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.07.2010, 17:04     написать программу для удаления положительных элементов очереди #10
Цитата Сообщение от Prosroma Посмотреть сообщение
нашел такую же задачу как у меня
Ну вообще говоря, задача совсем не такая же... Если нужно удалять элементы из середины, лучше использовать двухсвязные списки, иначе код будет не эффективным - прийдётся каждый раз по всему списку искать элемент, у которого next будет на удаляемый указывать. Мало того, нужно будет проверять - не первый ли в списке элемент, который удалить нужно, если да, не забыть указатель на начало списка подкорректировать... Ну или сразу, если первый елемент удалять не нужно, проверять, что тот, который после него находится, содержит... Короче, не так всё просто...
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 17:09  [ТС]     написать программу для удаления положительных элементов очереди #11
Цитата Сообщение от easybudda Посмотреть сообщение
Ну вообще говоря, задача совсем не такая же... Если нужно удалять элементы из середины, лучше использовать двухсвязные списки, иначе код будет не эффективным - прийдётся каждый раз по всему списку искать элемент, у которого next будет на удаляемый указывать. Мало того, нужно будет проверять - не первый ли в списке элемент, который удалить нужно, если да, не забыть указатель на начало списка подкорректировать...
Нужно просто просматривать очередь и удалять все положительные элементы,а потом вывести полученную очередь Можеш помочь,а то я просто не понимаю эту тему
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.07.2010, 17:09     написать программу для удаления положительных элементов очереди #12
А мне кажется, что как раз лучше будет использовать односвязные списки, т.к. все равно нужно будет перебирать все элементы списка.
Prosroma
0 / 0 / 0
Регистрация: 31.03.2010
Сообщений: 28
10.07.2010, 17:56  [ТС]     написать программу для удаления положительных элементов очереди #13
Помогите
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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 Посмотреть сообщение
все равно нужно будет перебирать все элементы списка.
Нужно будет - однозначно! Вопрос в том: сколько раз это прийдётся сделать...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2010, 18:41     написать программу для удаления положительных элементов очереди
Еще ссылки по теме:

C++ В данной матрице найти сумму положительных и отрицательных элементов. Написать программу выполнения этого задания
C++ Написать программу, которая создает двумерный массив со случайными числами A[N,M]. Вычислить сумму и число положительных элементов массива
Написать программу для удаления ленты в середине текстового файла C++

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

Или воспользуйтесь поиском по форуму:
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);
}
Нужно будет - однозначно! Вопрос в том: сколько раз это прийдётся сделать...
Спасибо,все работает
Yandex
Объявления
10.07.2010, 18:41     написать программу для удаления положительных элементов очереди
Ответ Создать тему
Опции темы

Текущее время: 01:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru