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

Удаление четных и отрицательных элементов (списки) - C++

Восстановить пароль Регистрация
 
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
21.05.2012, 20:47     Удаление четных и отрицательных элементов (списки) #1
Дан двусвязный список нужно удалить те элементы которые являются отрицательными и четными

Добавлено через 10 минут
в задаче сказано что уже имеется готовый список просто нужно написать метод который был выполнил данные условия

моя очень неудачная попытка которая оценена была очень низко
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct tElem
{ int value;
  tElem *next,*prev;
}
void delete_smt(tElem *&t)
{
tElem *a=t,*b;
 
if (a->value%2==0&&a->value<0)
 
     {   a->prev=NULL;
 
         delete (a);
     }
while (a->next!=NULL)
 
         {      b=a->prev->next;
                a->prev->next=a->next->next;
                a->next->prev=b;
                a=a->next;
                delete(a);
         }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 20:47     Удаление четных и отрицательных элементов (списки)
Посмотрите здесь:

Найти количество отрицательных элементов столбца, у которого сумма четных элементов не больше 30. C++
Сумму отрицательных четных элементов C++
C++ Работа с односвязным списком (удаление четных элементов)
C++ Одномерный массив. Найти количество и сумму отрицательных и четных элементов
Вычислить в массиве среднее квадратическое отрицательных элементов расположенных на четных местах C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
21.05.2012, 22:04     Удаление четных и отрицательных элементов (списки) #2
Прошу прощения, а вам можно использовать списки из STL?

Добавлено через 3 минуты
Ах, я условие не дочитал, вижу
Ну хорошо, я сейчас подправлю ваш код

Добавлено через 4 минуты
Ещё хотелось бы увидеть полную реализацию структуры со всеми функциями.
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
21.05.2012, 22:07  [ТС]     Удаление четных и отрицательных элементов (списки) #3
Цитата Сообщение от rakota Посмотреть сообщение

Добавлено через 4 минуты
Ещё хотелось бы увидеть полную реализацию структуры со всеми функциями.
какие вас именно функции интересуют?

на контрольной я писал именно этот код просто
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
21.05.2012, 22:12     Удаление четных и отрицательных элементов (списки) #4
В коде a удаляется оператором delete, значит где-то для неё выделяется память. Я бы хотел увидеть эту функцию.
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
21.05.2012, 22:20  [ТС]     Удаление четных и отрицательных элементов (списки) #5
я забыл указать в самом начале
t=new tElem;
вот как то так должно быть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct tElem
{ int value;
  tElem *next,*prev;
}
void delete_smt(tElem *&t)
{t=new tElem;
tElem *a=t,*b;
 
if (a->value%2==0&&a->value<0)
 
     {   a->prev=NULL;
 
         delete (a);
     }
while (a->next!=NULL)
 
         {      b=a->prev->next;
                a->prev->next=a->next->next;
                a->next->prev=b;
                a=a->next;
                delete(a);
         }
}
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
21.05.2012, 22:30     Удаление четных и отрицательных элементов (списки) #6
Собственно, вот весь мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct tElem
{
    int value;
    tElem *next;
    tElem *prev;
};
 
void delete_smt(tElem *t)
{
    tElem *a=t;
    if ((a->value % 2) == 0 && (a->value)<0)
    {
            a->next->prev=a->prev;
            a->prev->next=a->next;
    }
}
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
21.05.2012, 22:36  [ТС]     Удаление четных и отрицательных элементов (списки) #7
Цитата Сообщение от rakota Посмотреть сообщение
Собственно, вот весь мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct tElem
{
    int value;
    tElem *next;
    tElem *prev;
};
 
void delete_smt(tElem *t)
{
    tElem *a=t;
    if ((a->value % 2) == 0 && (a->value)<0)
    {
            a->next->prev=a->prev;
            a->prev->next=a->next;
    }
}
а не могли бы вы пояснить код?
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
21.05.2012, 22:44     Удаление четных и отрицательных элементов (списки) #8
Да, конечно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct tElem
{
    int value;
    tElem *next;
    tElem *prev;
};
 
void delete_smt(tElem *t)
{
    tElem *a=t; //а присваивается адрес из t, хотя можно было бы работать напрямую с t
    if ((a->value % 2) == 0 && (a->value)<0) // тут всё ясно
    {
            a->next->prev=a->prev; // указателю prev элемента, следующего за a присваивается адрес элемента, который находится в prev a
            a->prev->next=a->next; // указателю next элемента в prev a присваивается адрес элемента, который находится в next a
    }
}
Таким образом prev a "будет находится" перед next a, а сам узел a остаётся в памяти, но на него не указывает ни один другой.
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
21.05.2012, 22:55  [ТС]     Удаление четных и отрицательных элементов (списки) #9
Цитата Сообщение от rakota Посмотреть сообщение
Да, конечно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct tElem
{
    int value;
    tElem *next;
    tElem *prev;
};
 
void delete_smt(tElem *t)
{
    tElem *a=t; //а присваивается адрес из t, хотя можно было бы работать напрямую с t
    if ((a->value % 2) == 0 && (a->value)<0) // тут всё ясно
    {
            a->next->prev=a->prev; // указателю prev элемента, следующего за a присваивается адрес элемента, который находится в prev a
            a->prev->next=a->next; // указателю next элемента в prev a присваивается адрес элемента, который находится в next a
    }
}
Таким образом prev a "будет находится" перед next a, а сам узел a остаётся в памяти, но на него не указывает ни один другой.
спасибо но если вы не против я задам еще вопрос, ведь получается же что программа выполнится 1 раз, так как нет цикла? или я ошибаюсь ?
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
21.05.2012, 23:18     Удаление четных и отрицательных элементов (списки) #10
Именно. Функцию следует применять к каждому элементу, в стиле

C++
1
2
3
4
for(tElem* i = /*ЗДЕСЬ ПЕРВЫЙ ЭЛЕМЕНТ СПИСКА*/; i->next != NULL; i = i->next)
    {
        delete_smt(i);
    }
В принципе можно относительно легко переделать и саму функцию.
Я сделал именно так, потому что так легче менять реализацию самого списка.
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
22.05.2012, 00:55  [ТС]     Удаление четных и отрицательных элементов (списки) #11
решил проверить работоспобность программы но она работает неправильно

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
#include <iostream>
#include <fstream>
using namespace std;
 
struct tElem
{
    int value;
 
    tElem *next,*prev;
};
 
void print (tElem *z)
{
   while (z)
    {
        cout<<z->value<<" ";
        z=z->next;
    }
}
 
void create_list(tElem* &h1,ifstream &f)
{
tElem* temp;
 
h1=new tElem;
 
temp=h1;
 
f>>temp->value;
 
temp->prev=new tElem;
 
temp->prev=NULL;
 
while(f.peek()!=EOF)
    {
        temp->next=new tElem;
 
        temp=temp->next;
 
        temp->prev=temp;
 
        temp->next=NULL;
 
        f>>temp->value;
    }
 
}
 
void delete_smt(tElem *t)
{
    tElem *a=t;
    if ((a->value % 2) == 0 && (a->value)<0)
    {
            a->next->prev=a->prev;
            a->prev->next=a->next;
    }
}
 
int main()
{
    ifstream f("input.txt");
 
    tElem *t;
 
    create_list(t,f);
 
    while (t)
 
    {
        delete_smt(t);
 
        t=t->next;
    }
 
    print(t);
 
    return 0;
}
в чем же ошибка
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
22.05.2012, 20:40     Удаление четных и отрицательных элементов (списки) #12
Собственно, я немного доработал ваш код. Увы, не смог обойтись без <utility> и объекта pair, но можно как-то и без них обойтись, наверно.
Собственно ваша структура (тут ничего не изменилось)

C++
1
2
3
4
5
struct tElem
{
    int value;
    tElem *next,*prev;
};

Вывод

C++
1
2
3
4
5
6
7
8
9
void print (tElem *t)
{
    tElem* k = t;
    while(k)
    {
        cout<<k->value<<' ';
        k=k->next;
    }
}

Создание списка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
tElem* create_list(tElem* t, ifstream &f)
{
    tElem* temp;
    temp = t;
    temp = new tElem;
    f >> temp->value;
    temp->prev=NULL;
    tElem* r = temp;
    while(!f.eof())
    {
        temp->next=new tElem;
        temp->next->prev=temp;
        f >> temp->next->value;
        temp=temp->next;
    }
    temp->next = NULL;
    return r;
}

Реализация удаления таких-то чисел

Тут скорее всего возникнут вопросы. Спрашивайте.
C++
1
2
3
4
5
6
7
8
9
10
11
12
pair<tElem*,bool> _delete_smt(tElem *t)
{
    tElem *a=t;
    if ((a->value % 2) == 0 && (a->value)<0)
    {
        a->next->prev=a->prev;
        a->prev->next=a->next;
        tElem* m = a;
        return make_pair(m,1);
    }
    return make_pair(a,0);
}

Собственно удаление всех чисел по критерию

C++
1
2
3
4
5
6
7
8
9
10
void delete_smt(tElem *t)
{
    tElem* temp = t;
    while (temp)
    {
        pair<tElem*,bool> n = _delete_smt(temp);
        temp=temp->next;
        if(n.second) delete n.first;
    }
}

Очистка памяти

Обязательно удаляйте список после использования с помощью этой функции!
C++
1
2
3
4
5
6
7
8
9
10
void clear(tElem* t)
{
    tElem* temp = t->next, *t2 = t;
    while(temp)
    {
        delete t2;
        t2 = temp;
        temp = t2->next;
    }
}

main()

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    ifstream f("input.txt");
    if(!f) {cout << "fail!"; return 1;}
    tElem *list = NULL;
    list = create_list(list,f);
    print(list);
    delete_smt(list);
    print(list);
    clear(list);
    return 0;
}

Надеюсь, что всё правильно скопировал. Также я бы очень вам рекомендовал в дальнейшем оформить программу с помощью классов и ООП. Но это так, пожелание
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
22.05.2012, 22:36  [ТС]     Удаление четных и отрицательных элементов (списки) #13
pair<tElem*,bool> _delete_smt(tElem *t)
такое оформление к сожалению вижу впервые
make_pair(m,1); это видимо какой то стандартный метод которого я к сожалению не знаю
и к сожалению мы еще до классов и ООП не дошли так сказать
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
23.05.2012, 13:18     Удаление четных и отрицательных элементов (списки) #14
Тогда можно переделать так:
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
//начало программы, заголовочные файлы и т.д.
bool flag;
//Объявление tElem и функций...
tElem* _delete_smt(tElem *t)
{
    tElem *a=t;
    if ((a->value % 2) == 0 && (a->value)<0)
    {
        a->next->prev=a->prev;
        a->prev->next=a->next;
        tElem* m = a;
        flag = 1;
        return m;
    }
   flag = 0
   return a;
}
//
void delete_smt(tElem *t)
{
    tElem* temp = t;
    while (temp)
    {
        tElem* n = _delete_smt(temp);
        temp=temp->next;
        if(flag) delete n;
    }
}
Ну как-то так. Попробуйте, я не компилировал, но должно работать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2012, 05:01     Удаление четных и отрицательных элементов (списки)
Еще ссылки по теме:

Удаление отрицательных элементов динамического массива C++
C++ Разработать приложение поиска суммы отрицательных четных элементов в одномерном массиве
C++ Списки, удаление элементов до найденного максимального значения

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

Или воспользуйтесь поиском по форуму:
crewww
30 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 102
26.05.2012, 05:01  [ТС]     Удаление четных и отрицательных элементов (списки) #15
спасибо с этой задачей я разобрался, а не могли бы вы помочь с такой задачей
нужно отсортировать односвязный список перестановкой элементов (то есть перенаправляя указатели)
моя попытка решения
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
#include <iostream>
#include <fstream>
using namespace std;
struct tElem
{
 int val;
 tElem *r;
 
};
 
void print (tElem *t)
{   tElem *z=t;
   while (z!=NULL)
    {
        cout<<z->val<<" ";
 
        z=z->r;
 
    }
}
 
void create_list(tElem* &h1,ifstream &f)
{
tElem* temp;
 
h1=new tElem;
 
temp=h1;
 
f>>temp->val;
 
while(f.peek()!=EOF)
    {
        temp->r=new tElem;
 
        temp=temp->r;
 
        temp->r=NULL;
 
        f>>temp->val;
    }
 
}
int main()
{
    ifstream file("bubble.txt");
    tElem *z;
    create_list(z,file);
 
tElem *p,*k=z; bool run=true;
while (run)
 
    {   run=false;
            while (k)
            {   if (k->r)
 
                    if(k->val>k->r->val&&k->r->r)
                    {
 
                        p=k->r;
 
                        k=k->r->r;
 
                        k->r=z;
 
                        k=p;
 
                        z=k;
 
                        run=true;
 
 
                    }
            }
 
    }
 
 
    print(z);
    getchar();
return 0;
file.close();
}
но код нерабочий к сожалению в чем моя ошибка?

Добавлено через 5 часов 5 минут
вот этот код более разумный но все равно не рабочий
мне сложно представить как именно надо менять ссылки чтобы их не потерять

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
#include <fstream>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
    struct sp
    {
        int data;
        sp *next;
    };
    
void create(sp* &h1,ifstream &f)
{
sp* temp;
 
h1=new sp;
 
temp=h1;
 
f>>temp->data;
 
while(f.peek()!=EOF)
    {
        temp->next=new sp;
 
        temp=temp->next;
 
        temp->next=NULL;
 
        f>>temp->data;
    }
 
}
    
    void sort(sp *nach)
    {
        sp *list_ptr;
sp *pre_ptr=NULL;
bool run=true;
while (run){
   run=false;
   list_ptr=nach;
   while (list_ptr->next)
    {
        if (list_ptr->data > list_ptr->next->data){
               
                if (list_ptr==nach)
                {
                    nach=list_ptr->next;
                    list_ptr->next=nach->next;
                    nach->next=list_ptr;
                }
                else
                {
                    pre_ptr->next=list_ptr->next;
                    list_ptr->next=list_ptr->next->next;
                    pre_ptr->next->next=list_ptr;
                }
                run=true;
               }
        pre_ptr=list_ptr;
        list_ptr=list_ptr->next;
         
    }
}
    }
    
    void pokaz(sp *nach)
    {
        sp *p = nach;
        while (p)
        {
            cout << p -> data <<" ";
            p = p -> next;
        }
        cout << endl;
    }
    
    void main()
    {   ifstream f("bubble.txt");
        sp *nach;
        create(nach, f);
        pokaz(nach);
        sort(nach);
        pokaz(nach);
        f.close();
        system("pause");
    }
Добавлено через 33 минуты
элементы последний с предпоследним не меняются

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
#include <fstream>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
    struct sp
    {
        int data;
        sp *next;
    };
    
void create(sp* &h1,ifstream &f)
{
sp* temp;
 
h1=new sp;
 
temp=h1;
 
f>>temp->data;
 
while(f.peek()!=EOF)
    {
        temp->next=new sp;
 
        temp=temp->next;
 
        temp->next=NULL;
 
        f>>temp->data;
    }
 
}
    
    void sort(sp *&nach)
{
        sp *list_ptr;
sp *pre_ptr=NULL;
bool run=true;
while (run)
    {
 
   run=false;
   list_ptr=nach;
   while (list_ptr->next && list_ptr->next->next)
      {
        if (list_ptr->data > list_ptr->next->data)
          {
               
                if (list_ptr==nach)
                {
                    nach=list_ptr->next;
                    list_ptr->next=nach->next;
                    nach->next=list_ptr;
                }
                else
                { 
                    pre_ptr->next=list_ptr->next;
                    list_ptr->next=list_ptr->next->next;
                    pre_ptr->next->next=list_ptr;
                }
                run=true;
          }
        pre_ptr=list_ptr;
        list_ptr=list_ptr->next;
        
      }
 
    }
}
    
    void pokaz(sp *nach)
    {
        sp *p = nach;
        while (p)
        {
            cout << p -> data <<" ";
            p = p -> next;
        }
        cout << endl;
    }
    
    void main()
    {   ifstream f("bubble.txt");
        sp *nach;
        create(nach, f);
        pokaz(nach);
        sort(nach);
        pokaz(nach);
        f.close();
        system("pause");
    }
Yandex
Объявления
26.05.2012, 05:01     Удаление четных и отрицательных элементов (списки)
Ответ Создать тему
Опции темы

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