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

#include <iostream>
using namespace std;
//Описание узла списка.
 
struct Node {
int d;
Node *next;
Node *prev;
Node():next(NULL),prev(NULL), d(-332215){}
Node(Node* ptr_n, Node *ptr_p , int data): next(ptr_n),prev(ptr_p), d(data) {}
};
 
 
//Функции для работы со списком.
//--------------------------------------------------------
Node * Create(int data);                 //создает список.
int add(Node**const pend , int data);    //добавить в конец списка.
int pop(Node**const pbeg);               //выборка  из начала списка.
 
//полная выборка.  
void Update(Node **const pbeg, Node** const pend ){ while(*pbeg)pop(pbeg); (*pend)=NULL; }       
 
void ShowE(Node *pend);                  //показать с конца.
void ShowB(Node *pbeg);                  //показать с начала.
/*выводит в зависимости от того: какой указатель передан: на конец или начало. для кольцевых не работает. */
void Show(Node *ptr); 
//--------------------------------------------------------
int main(){
 
Node *pbeg = NULL;     //на начало списка.
Node *pend = NULL;     //на конец  списка.
int numb; 
cout<<"Input numb\t"; cin>>numb;
pend = Create(numb);    //создаем   список.
pbeg = pend;
 
int i = 0;
while(i<10){ 
cout<<"Input numb\t"; cin>>numb;
add(&pend,numb);
i++;
}
Show(pend);
Show(pbeg);
Update(&pbeg,&pend);
return 0;
}
//создает список.
Node * Create(int data){ Node *pv = new Node(NULL,NULL,data); ; return pv; }
 
//добавить в конец списка.
int add(Node**const pend , int data){
Node *pv = new Node(NULL,*pend,data);
(*pend)->next = pv; 
(*pend) = pv;
return 0;
}
 
//выборка  из начала списка.
int pop(Node**const pbeg){
Node *tmp = (*pbeg);
if(tmp){
int d = tmp->d;
(*pbeg)=(*pbeg)->next;
delete tmp;
return d;
}
return -1;
}
 
//показать с конца.
void ShowE(Node *pend){ while(pend){    cout<<pend->d<<' '; pend = pend->prev;   } cout<<endl;     }
//показать с начала.
void ShowB(Node *pbeg){ while(pbeg){    cout<<pbeg->d<<' '; pbeg = pbeg->next;   } cout<<endl;     }    
 
/*выводить в зависимости от того: какой указатель передан: на конец или начало. для кольцевых не работает. */
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 ;
}
 
}

Leave a Comment