C++

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

#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;
}
Теги:
список, строка
Добавлено: 16 Сентября 2013 02:32:09 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...