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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
tubus1993
1 / 1 / 0
Регистрация: 15.04.2011
Сообщений: 17
#1

Удалить из списка все элементы с нечётными значениями и вывести указатель p2 на начало преобразованного списка. - C++

11.11.2011, 08:54. Просмотров 1444. Ответов 2
Метки нет (Все метки)

Здравствуйте.
Не получается решить задачу.
Условие.
Дан непустой двусвязный список. Удалить из списка все элементы с
нечётными значениями и вывести указатель p2 на начало
преобразованного списка. Если в результате удаления элементов список
окажется пустым, то положить p2 = NULL. После удаления элементов из
списка освобождать память, занимаемую этими элементами.

Вот накарябал
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
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>
 
 
 
using namespace std;
 
class Node
{
public:
        Node();
        ~Node();
        int number;
        Node* P1;
        Node* P2;
        void printNode(); //печатает
        void delNode();  //удаляет
        
};
 
Node::Node()    //кошмарного вида конструктор       
{
    P1 = NULL;
    P2 = NULL;
    number = 0;
}
 
Node::~Node()  // деструктор
{
   
}
 
int main()
{
   
   srand ( time(NULL) );
   int k,numb=-1;
   cout<<"Vvedite chislo elementov "; //тут вибыраю кол-во элементов
   cin>>k;
   for(int n=0;n<k;n++)
   {
      numb=rand()%10;   //рандом
      Node* ptr = new Node;
      ptr->number = numb;
      ptr->P1 = NULL;
   }
getch();
}
 
 void Node::printNode()  //эта часть вообще под вопросом
{
     Node *ptr = P1;
     
     while (ptr)
     {
         cout<<ptr->number<<"\n";
         ptr = ptr->P1;
     }
}
Хотел создать двусвязный список числа для которого рандомны.Главная проблема это как реализовать конструктор и деструктор.И как вывести на экран только четные значения.

Добавлено через 23 минуты
C++
1
2
3
4
5
6
7
8
9
 void Node::printNode()  //эта часть вообще под вопросом
{
     Node *ptr = P1;
     
     while (ptr)
     {
         cout<<ptr->number<<"\n";
         ptr = ptr->P1;
     }
ну вот это помойму вообще косяк на косяке)

Добавлено через 8 часов 40 минут
help!Не успеваю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2011, 08:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить из списка все элементы с нечётными значениями и вывести указатель p2 на начало преобразованного списка. (C++):

Получить указатель на элемент двунаправленного списка, добавить значение в начало списка и очистить его - C++
Нужно создать двунаправленный список //вроде так, но не уверен struct Double_List {//структура данных int Data;...

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

Скопировать в начало списка все положительные элементы, расположенные во второй половине - C++
Уважаемые товарищи программисты. Уже 100 раз расстроился что пошёл по пути С++. 1)Дан вектор V с четным количеством элементов. Решить для...

Удалить из списка все отрицательные элементы - C++
Постановка задачи: Составить программу, которая удаляет из списка все отрицательные элементы люди умные спасите от провала в...

Вывести элементы заданного массива с нечётными номерами и чётными значениями - C++
Задан массив с количеством элементов N. Вывести элементы с нечетными номерами, являющиеся четными.

Удалить из списка все элементы, заканчивающиеся на цифру 2 - C++
Удалить из списка все элементы, заканчивающиеся на цифру 2 Вот структура если что: typedef struct SNum{ ...

2
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.11.2011, 11:23 #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
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <iostream>
#include <time.h>
using namespace std;
 
template<class T>
class xList {
   struct node {
       T data;
        node*  prev;
        node*  next;
   };
private:
   node*  lst;
   node*  ptr;
public:
  typedef node*  xNode;
  xList(void) : lst(NULL), ptr(NULL) {}
  ~xList() {
       this->clear();
  }
public:
     void  add_front(T data) {
         node*  _new = new node();
         _new->data  = data;
         if(! lst) {
              lst = _new;
              lst->next = lst;
              lst->prev = lst;
         } else {
             _new->next = lst;
             _new->prev = lst->prev;
             lst->prev->next = _new;
             lst = _new;
         }
     }
 
     void  add_back(T data) {
         node*  _new = new node();
         _new->data  = data;
         if(! lst) 
              this->add_front(data);
         else {
              _new->next = lst;
              _new->prev = lst->prev;
              lst->prev->next = _new;
              lst->prev = _new;
         }
     }
 
     void pop_front(void) {
         if(lst == lst->prev) {
              delete lst;
              lst = NULL;
              return;
        }
        node* tmp = lst;
        lst = lst->next;
        lst->prev = tmp->prev;
        lst->prev->next = tmp->next;
        delete tmp;
        tmp = NULL;
     }
 
     void pop_back(void) {
         if(lst == lst->prev) {
              delete lst;
              lst = NULL;
              return;
         }
         node*  tmp = lst->prev;
         lst->prev  = tmp->prev;
         lst->prev->next = tmp->next;
         delete tmp;
         tmp = NULL;
     }
 
     void  remove(xNode  iter) {
          node*  tmp;
          if(iter == lst) {
              this->pop_front();
              return;
          } 
          tmp = iter;
          iter->prev->next = iter->next;
          iter->next->prev = iter->prev;
          delete tmp;
          tmp = NULL;
          ptr = NULL;
     }
 
     void  reset(void) {
            ptr = NULL;
      }
 
      bool  move_next(void) {
            if(ptr == NULL) {
                  ptr = lst;
                  return true;
            }
            if(ptr == lst->prev) {
                  ptr = NULL;
                  return false;
            }
            ptr = ptr->next;
            return true;
      }
 
       bool  move_prev(void) {
            if(ptr == NULL) {
                 ptr = lst->prev;
                 return true;
            }
            if(ptr == lst) {
                 ptr = NULL;
                 return false;
            }
            ptr = ptr->prev;
            return true;
       }
 
    T&  current(void) {
              if(! ptr)
                   return lst->data;
               return ptr->data;
    }
 
    xNode element(void) {
                return ptr;
    }
 
    T&  back(void) {
                return lst->prev->data;
    }
 
    T& front(void) {
                 return lst->data;
    }
 
    bool empty(void) const {
                return (! lst);
    }
 
    void clear(void) {
                 while(! this->empty())
                     this->pop_back();
    }
};
 
 
 
 
int main(void) {
 
  xList<int>  l;
  int n = 0;
  cout<<"Vvedite chislo elementov "; 
  cin >> n;
 
  srand(time(NULL));
  for(int i = 0; i < n; i++)
       l.add_back( rand() % 10 );
 
  // показать исходный список
  while( l.move_next() ) 
       cout << l.current() << ", ";
  cout << endl << endl;
 
  // процесс удаления
  while( l.move_next() ) {
      if(l.current() % 2) {
           l.remove(l.element());
           l.reset();
      }
  }
  
  // показать список после удаления нечётных значений-элементов
  while( ! l.empty()) {
      cout << l.front() << ", ";
      l.pop_front();
  }
 
 // l.clear();
  
  cin.ignore(1, '\n');
  cin.get();
  return 0;
}
1
tubus1993
1 / 1 / 0
Регистрация: 15.04.2011
Сообщений: 17
16.11.2011, 23:36  [ТС] #3
Спасибо большое,сейчас буду разбиратся
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2011, 23:36
Привет! Вот еще темы с ответами:

Удалить из списка все элементы, заканчивающиеся на цифру 2 - C++
Работа с двунаправленными списками. Вот структура: typedef struct SNum{ int num; /* поле для числа */ ...

Удалить из списка все элементы с четными информационными полями - C++
Добрый день. Помогите с заданиями, вообще не пойму как их делать, а их срочно нужно сделать: 1) однонаправленый список: Тип...

Описать функцию, которая определяет, входят ли все элементы первого списка в состав второго списка. - C++
Описать функцию, которая определяет, входят ли все элементы первого списка в состав второго списка. на с++

Добавить в конец списка L1 все элементы списка L2 - C++
Разработать программу обработки односвязных линейных списков с числом элементов в списке не менее пяти в соответствии с индивидуальным...


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

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

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