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

Поместить в стек из динамического списка - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.95
sveta11115
0 / 0 / 0
Регистрация: 20.03.2010
Сообщений: 39
15.05.2010, 21:27     Поместить в стек из динамического списка #1
У меня такая задача:
Последовательность вещественных чисел сохранить в динамическом списке. Поместить в стек все отрицательные числа, исключив их из динамического списка.
Я создала список (вложенный файл), но не знаю, как поместить в стек отрицательные числа.
Может, напишете, как сделать.
Вложения
Тип файла: doc первая часть задания1.doc (35.0 Кб, 109 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2010, 21:27     Поместить в стек из динамического списка
Посмотрите здесь:

Стек на основе динамического массива C++
C++ Структура в виде динамического списка
C++ Не выводится содержимое динамического списка
Поместить символ в стек C++
C++ созднание динамического списка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
16.05.2010, 15:28     Поместить в стек из динамического списка #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
#include <iostream>
using namespace std;
 
 
//Описание узла списка.
struct Node {
double d;
Node *next;
Node *prev;
Node():next(NULL),prev(NULL), d(-332215){}
Node(Node* ptr_n, Node *ptr_p , double data): next(ptr_n),prev(ptr_p), d(data) {}
};
 
//Функции для работы со списком.
//--------------------------------------------------------
Node * Create(double data);                  //создает список.
void add(Node**const pend , double data);    //добавить в конец списка.
double pop(Node**const pbeg);                //выборка  из начала списка.
//полная выборка.  
void Update(Node **const pbeg ){ while(*pbeg)pop(pbeg); }       
void Show(Node *ptr); 
//--------------------------------------------------------
 
//Описание узла стека.
struct Stack {
double d;
Stack *next;
Stack(): next(NULL), d(-332215){}
Stack(Stack *ptr, double data): next(ptr), d(data){}
};
 
//-------------------------------------------------------------
//Для работы со стеком:
void push(Stack**const top, double data);      //положить на верщину стека.
double pop(Stack**const top);                  //выборка из стека.
void Show(Stack *ptr);                         //показать стек.
 
//очистить стек.
void Update(Stack **const top) { while(*top)pop(top);   }           
//--------------------------------------------------------------
long DeleteNegFromListANDFormStack(Node**const pbeg, Node **const pend, Stack**const top);
 
 
//Клиентская часть.
int main(){
Stack *top = NULL;      //на вершину стека.
 
Node *pbeg = NULL;      //на начало списка.
Node *pend = NULL;      //на конец  списка.
 
pend = Create(200);      //создаем   список.
pbeg = pend;
 
 
int i = -10;
while(i<10){ add(&pend,i); i++; }
cout<<"Print List: ";Show(pbeg);
 
 
DeleteNegFromListANDFormStack(&pbeg,&pend,&top);
 
cout<<"Print List: ";Show(pbeg);
cout<<"Print Stack: ";Show(top);
 
 
Update(&top);    //memory free
Update(&pbeg);   //memore free
return 0;
}
 
 
 
 
 
//создает список.
Node * Create(double data){ Node *pv = new Node(NULL,NULL,data); ; return pv; }
 
//добавить в конец списка.
void add(Node**const pend , double data){
Node *pv = new Node(NULL,*pend,data);
(*pend)->next = pv; 
(*pend) = pv;
}
 
//выборка  из начала списка.
double pop(Node**const pbeg){
Node *tmp = (*pbeg);
if(tmp){
double d = tmp->d;
(*pbeg)=(*pbeg)->next;
delete tmp;
return d;
}
return -1;
}
 
 
 
/*выводить в зависимости от того: какой указатель передан: на конец или начало. для кольцевых не работает. */
void Show(Node *ptr){
//Выводим список с конца. если:
if((ptr->next == NULL)&&(ptr->prev!=NULL)){ while(ptr){ cout<<ptr->d<<' '; ptr=ptr->prev;   } cout<<endl; return; }
//Выводим сначала если
if((ptr->next != NULL)&&(ptr->prev==NULL)){ while(ptr){ cout<<ptr->d<<' '; ptr=ptr->next;   } cout<<endl; return; }
return ;
}
 
 
//положить на верщину стека.
void push(Stack**const top, double data){
    if(*top==NULL){
    Stack *pv = new Stack(NULL,data);
    (*top) = pv;
    return ;
    }
    else {
    Stack *pv= new Stack(*top,data);
    (*top) = pv;
    return ;
    }
}
 
//выборка из стека.
double pop(Stack**const top){
Stack * tmp = (*top);   
if(tmp){ double d = tmp->d; (*top)=(*top)->next; delete tmp; return d; }
return -1;
}
//показать стек.
void Show(Stack *ptr){ while(ptr){ cout<<ptr->d<<' '; ; ptr = ptr ->next; } cout<<endl;   }
 
 
 
 
long DeleteNegFromListANDFormStack(Node**const pbeg, Node **const pend, Stack**const top){
if((*pbeg)==NULL||(*pend)==NULL)return false;
Node * temp = *pbeg;
 
while(temp){
    if(temp->d<0){
        if(temp ==(*pend)){
        (*pend)=(*pend)->prev;
        (*pend)->next=NULL;
        }
 
    
        else if(temp ==(*pbeg)){
        (*pbeg)=(*pbeg)->next;
        (*pbeg)->prev=NULL;
        }
 
        else  {      
        (temp->prev)->next=temp->next;
        (temp->next)->prev=temp->prev;  }
  
        push(top,temp->d);
        delete temp;  
        temp = NULL; 
        temp = *pbeg; 
        continue;   
    }
temp=temp->next; 
}
 
return 0;
}

Ваше вложение, я не смотрел: не люблю ковыряться в чужом коде.
Надеюсь мое решение вам пригодиться.
sveta11115
0 / 0 / 0
Регистрация: 20.03.2010
Сообщений: 39
20.05.2010, 00:14  [ТС]     Поместить в стек из динамического списка #3
Большое спасибо.
Только не подскажете, при запуске программы, я не вижу результаты работы программы. Черный экранчик на секунду мелькнет, и погаснет.
И уже выдается сообщение. Программа завершилась с кодом 0.
Как мне увидеть результаты?

Добавлено через 30 секунд
Genius Ignat,
Большое спасибо.
Только не подскажете, при запуске программы, я не вижу результаты работы программы. Черный экранчик на секунду мелькнет, и погаснет.
И уже выдается сообщение. Программа завершилась с кодом 0.
Как мне увидеть результаты?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.05.2010, 13:14     Поместить в стек из динамического списка #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
using namespace std;
 
//Описание узла списка.
struct Node {
double d;
Node *next;
Node *prev;
Node():next(NULL),prev(NULL), d(-332215){}
Node(Node* ptr_n, Node *ptr_p , double data): next(ptr_n),prev(ptr_p), d(data) {}
};
 
//Функции для работы со списком.
//--------------------------------------------------------
Node * Create(double data);                  //создает список.
void add(Node**const pend , double data);    //добавить в конец списка.
double pop(Node**const pbeg);                //выборка  из начала списка.
//полная выборка.  
void Update(Node **const pbeg, Node **const pend ){ while(*pbeg)pop(pbeg); (*pend) = NULL; }       
void Show(Node *ptr); 
//--------------------------------------------------------
 
 
//Описание узла стека.
struct Stack {
double d;
Stack *next;
Stack(): next(NULL), d(-332215){}
Stack(Stack *ptr, double data): next(ptr), d(data){}
};
 
 
//-------------------------------------------------------------
//Для работы со стеком:
void push(Stack**const top, double data);      //положить на верщину стека.
double pop(Stack**const top);                  //выборка из стека.
void Show(Stack *ptr);                         //показать стек.
//очистить стек.
void Update(Stack **const top) { while(*top)pop(top);   }   
        
//---------------------------------------------------------------------------------------
long DeleteNegFromListANDFormStack(Node**const pbeg, Node **const pend, Stack**const top);
 
 
//Клиентская часть.
int main(){
 
Stack *top = NULL;      //на вершину стека.
 
Node *pbeg = NULL;      //на начало списка.
Node *pend = NULL;      //на конец  списка.
 
pend = Create(-200);      //создаем   список.
pbeg = pend;
 
 
int i = -10;
while(i++<10)add(&pend,i);
cout<<"Print List: ";Show(pbeg);
DeleteNegFromListANDFormStack(&pbeg,&pend,&top);
 
cout<<"Print List: ";Show(pbeg);
cout<<"Print Stack: ";Show(top);
 
Update(&top);           //memory free
Update(&pbeg,&pend);    //memore free
 
system("pause");        //что програ не закрывалась, сразу.
return 0;
}
 
//создает список.
Node * Create(double data){ Node *pv = new Node(NULL,NULL,data); ; return pv; }
 
//добавить в конец списка.
void add(Node**const pend , double data){
Node *pv = new Node(NULL,*pend,data);
(*pend)->next = pv; 
(*pend) = pv;
}
 
//выборка  из начала списка.
double pop(Node**const pbeg){
Node *tmp = (*pbeg);
if(tmp){
double d = tmp->d;
(*pbeg)=(*pbeg)->next;
delete tmp;
return d;
}
return -1;
}
 
 
 
/*выводить в зависимости от того: какой указатель передан: на конец или начало. для кольцевых не работает. */
void Show(Node *ptr){
if(ptr){
if((ptr->next==NULL)&&(ptr->prev==NULL))  {while(ptr){  cout<<ptr->d<<' '; ptr=ptr->prev;   } cout<<endl; return; }
//Выводим список с конца. если:
if((ptr->next == NULL)&&(ptr->prev!=NULL)){ while(ptr){ cout<<ptr->d<<' '; ptr=ptr->prev;   } cout<<endl; return; }
//Выводим сначала если
if((ptr->next != NULL)&&(ptr->prev==NULL)){ while(ptr){ cout<<ptr->d<<' '; ptr=ptr->next;   } cout<<endl; return; }
return ;
}
 
}
 
 
//положить на верщину стека.
void push(Stack**const top, double data){
    if(*top==NULL){
    Stack *pv = new Stack(NULL,data);
    (*top) = pv;
    return ;
    }
    else {
    Stack *pv= new Stack(*top,data);
    (*top) = pv;
    return ;
    }
}
 
 
//выборка из стека.
double pop(Stack**const top){
Stack * tmp = (*top);   
if(tmp){ double d = tmp->d; (*top)=(*top)->next; delete tmp; return d; }
return -1;
}
//показать стек.
void Show(Stack *ptr){ while(ptr){ cout<<ptr->d<<' '; ; ptr = ptr ->next; } cout<<endl;   }
 
 
 
 
long DeleteNegFromListANDFormStack(Node**const pbeg, Node **const pend, Stack**const top){
if((*pbeg)==NULL||(*pend)==NULL)return -1;
Node * temp = *pbeg;
 
//Если в списке только один узел.
if(temp->next==NULL&&temp->prev==NULL&&temp->d<0){
push(top,temp->d);
delete temp;
*pbeg = NULL;
*pend = NULL; 
return 2;
}
 
 
while(temp){
    if(temp->d<0){
        if(temp ==(*pend)){
        (*pend)=(*pend)->prev;
        (*pend)->next=NULL;
        }
 
    
        else if(temp ==(*pbeg)){
        (*pbeg)=(*pbeg)->next;
        (*pbeg)->prev=NULL;
        }
 
        else  {      
        (temp->prev)->next=temp->next;
        (temp->next)->prev=temp->prev;  }
  
        push(top,temp->d);
        delete temp;  
        temp = NULL; 
        temp = *pbeg; 
        continue;   
    }
temp=temp->next; 
}
 
 
 
 
 
return 0;
}
Должно работать.
В программу внес еще поправки небольшие.
sveta11115
0 / 0 / 0
Регистрация: 20.03.2010
Сообщений: 39
20.05.2010, 19:15  [ТС]     Поместить в стек из динамического списка #5
Большое спасибо. Все работает. Только генерируются целые числа.
Не сделаете вещественные?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.05.2010, 19:40     Поместить в стек из динамического списка #6
Какая разница все равно числа преобразуются к double.

если так надо увидеть дробную часть.
Поменяйте это:
C++
1
pend = Create(-200);      //создаем   список.
на это:
C++
1
pend = Create(-200.5);      //создаем   список.
и это:
C++
1
2
int i = -10;
while(i++<10)add(&pend,i);
на это:

C++
1
2
double i = -10.0;
while((i+=0.5)<10.0)add(&pend,i);
sveta11115
0 / 0 / 0
Регистрация: 20.03.2010
Сообщений: 39
23.05.2010, 16:07  [ТС]     Поместить в стек из динамического списка #7
Если можно, сделайте, пожалуйста, ввод вещественных чисел в массив(или с клавиатуры или случайным образом). А то учитель не принял у меня программу из за этого.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
23.05.2010, 16:42     Поместить в стек из динамического списка #8
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
#include <iostream>
using namespace std;
 
//Описание узла списка.
struct Node {
double d;
Node *next;
Node *prev;
Node():next(NULL),prev(NULL), d(-332215){}
Node(Node* ptr_n, Node *ptr_p , double data): next(ptr_n),prev(ptr_p), d(data) {}
};
 
//Функции для работы со списком.
//--------------------------------------------------------
Node * Create(double data);                  //создает список.
void add(Node**const pend , double data);    //добавить в конец списка.
double pop(Node**const pbeg);                //выборка  из начала списка.
//полная выборка.  
void Update(Node **const pbeg, Node **const pend ){ while(*pbeg)pop(pbeg); (*pend) = NULL; }       
void Show(Node *ptr); 
//--------------------------------------------------------
 
 
//Описание узла стека.
struct Stack {
double d;
Stack *next;
Stack(): next(NULL), d(-332215){}
Stack(Stack *ptr, double data): next(ptr), d(data){}
};
 
 
//-------------------------------------------------------------
//Для работы со стеком:
void push(Stack**const top, double data);      //положить на верщину стека.
double pop(Stack**const top);                  //выборка из стека.
void Show(Stack *ptr);                         //показать стек.
//очистить стек.
void Update(Stack **const top) { while(*top)pop(top);   }   
        
//---------------------------------------------------------------------------------------
long DeleteNegFromListANDFormStack(Node**const pbeg, Node **const pend, Stack**const top);
 
 
//Клиентская часть.
int main(){
 
double numb ;
Stack *top = NULL;      //на вершину стека.
Node *pbeg = NULL;      //на начало списка.
Node *pend = NULL;      //на конец  списка.
 
cout<<"Input numb: ";cin>>numb;
pend = Create(numb);      //создаем   список.
pbeg = pend;
;
 
int i = 0;
while(i<10){
cout<<"Input numb: ";cin>>numb;
add(&pend,numb);
i++;
}
 
cout<<"Print List: ";Show(pbeg);
DeleteNegFromListANDFormStack(&pbeg,&pend,&top);
 
cout<<"Print List: ";Show(pbeg);
cout<<"Print Stack: ";Show(top);
 
Update(&top);           //memory free
Update(&pbeg,&pend);    //memore free
 
system("pause");        //что програ не закрывалась, сразу.
return 0;
}
 
//создает список.
Node * Create(double data){ Node *pv = new Node(NULL,NULL,data); ; return pv; }
 
//добавить в конец списка.
void add(Node**const pend , double data){
Node *pv = new Node(NULL,*pend,data);
(*pend)->next = pv; 
(*pend) = pv;
}
 
//выборка  из начала списка.
double pop(Node**const pbeg){
Node *tmp = (*pbeg);
if(tmp){
double d = tmp->d;
(*pbeg)=(*pbeg)->next;
delete tmp;
return d;
}
return -1;
}
 
 
 
/*выводить в зависимости от того: какой указатель передан: на конец или начало. для кольцевых не работает. */
void Show(Node *ptr){
if(ptr){
if((ptr->next==NULL)&&(ptr->prev==NULL))  {while(ptr){  cout<<ptr->d<<' '; ptr=ptr->prev;   } cout<<endl; return; }
//Выводим список с конца. если:
if((ptr->next == NULL)&&(ptr->prev!=NULL)){ while(ptr){ cout<<ptr->d<<' '; ptr=ptr->prev;   } cout<<endl; return; }
//Выводим сначала если
if((ptr->next != NULL)&&(ptr->prev==NULL)){ while(ptr){ cout<<ptr->d<<' '; ptr=ptr->next;   } cout<<endl; return; }
return ;
}
 
}
 
 
//положить на верщину стека.
void push(Stack**const top, double data){
    if(*top==NULL){
    Stack *pv = new Stack(NULL,data);
    (*top) = pv;
    return ;
    }
    else {
    Stack *pv= new Stack(*top,data);
    (*top) = pv;
    return ;
    }
}
 
 
//выборка из стека.
double pop(Stack**const top){
Stack * tmp = (*top);   
if(tmp){ double d = tmp->d; (*top)=(*top)->next; delete tmp; return d; }
return -1;
}
//показать стек.
void Show(Stack *ptr){ while(ptr){ cout<<ptr->d<<' '; ; ptr = ptr ->next; } cout<<endl;   }
 
 
 
 
long DeleteNegFromListANDFormStack(Node**const pbeg, Node **const pend, Stack**const top){
if((*pbeg)==NULL||(*pend)==NULL)return -1;
Node * temp = *pbeg;
 
while(temp){
    if(temp->d<0){
 
//Если в списке остался только один узел, или был только один узел.
if(temp->next==NULL&&temp->prev==NULL){
push(top,temp->d);
delete temp;
*pbeg = NULL;
*pend = NULL; 
return 0;
}
        if(temp ==(*pend)){
        (*pend)=(*pend)->prev;
        (*pend)->next=NULL;
        }
 
    
        else if(temp ==(*pbeg)){
        (*pbeg)=(*pbeg)->next;
        (*pbeg)->prev=NULL;
        }
 
        else  {      
        (temp->prev)->next=temp->next;
        (temp->next)->prev=temp->prev;  }
  
        push(top,temp->d);
        delete temp;  
        temp = NULL; 
        temp = *pbeg; 
        continue;   
    }
temp=temp->next; 
}
 
 
return 0;
}
Вот с вводом.
Так же немного подправил функцию, потому как она не правильно работала если в списке только
отрицательные.
sveta11115
0 / 0 / 0
Регистрация: 20.03.2010
Сообщений: 39
23.05.2010, 18:32  [ТС]     Поместить в стек из динамического списка #9
Огромное спасибо!!!!

Добавлено через 1 минуту
Не подскажете, что это такое - d(-332215)
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
23.05.2010, 18:48     Поместить в стек из динамического списка #10
Некое число по-умолчанию. Можете написать какое нибудь свое число, естественно в пределах допустимого значения типа double.
Это число не имеет в данной программе особого значения.

Добавлено через 1 минуту
d(-332215) - это инициализация данных узла списка.
sveta11115
0 / 0 / 0
Регистрация: 20.03.2010
Сообщений: 39
23.05.2010, 18:57  [ТС]     Поместить в стек из динамического списка #11
то есть первоначальное значение информационной части узла? А потом уже вводим, что хотим c клавиатуры?
Genius Ignat
23.05.2010, 19:15
  #12

Не по теме:


Если это нужно знать преподавателю, тогда
наберите в гугол: конструктор по умолчанию, и конструктор с параметрами.
Свое время на объяснения тратить не буду, да и тем более я не преподаватель,
что бы кому-то, что то в втолковывать, мне за это не платят.
Надеюсь не обидел.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2010, 19:31     Поместить в стек из динамического списка
Еще ссылки по теме:

Обмен элементов динамического списка C++
Абстрактный класс динамического списка C++
C++ Списки. Как создать одновременно 2 списка? Как из второго списка поместить элементы в первый?

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

Или воспользуйтесь поиском по форуму:
sveta11115
0 / 0 / 0
Регистрация: 20.03.2010
Сообщений: 39
23.05.2010, 19:31  [ТС]     Поместить в стек из динамического списка #13
Я убрала d() совсем - чтобы меньше вопросов было - все равно работает
Yandex
Объявления
23.05.2010, 19:31     Поместить в стек из динамического списка
Ответ Создать тему
Опции темы

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