Поместить в стек из динамического списка
#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;
}
Комментарии:
Нету комментариев для вывода...