Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

SIAOD / Списики / CIKL2SVZ

.CPP
Скачиваний:
6
Добавлен:
20.03.2015
Размер:
2.88 Кб
Скачать
#include<iostream.h>
#include<conio.h>
class _2svz {
	private:
		struct list {
			int num;
			list* next;
			list* prev;
		};
		list* head,*tail;
	public:
		_2svz(int n);
		~_2svz();
		void output();
		void add(int add_place, int &n);
		void Del(int del_place, int &n);
};
void main(){
	clrscr();
	int n;
	do{
		clrscr();
		cout<<"Vvedite kol-vo elementov n=";
		cin>>n;
	}while(n<=0 || n>100);
	_2svz *object=new _2svz(n);
	object->output();
	int exit=1;
	while(exit == 1){
		clrscr();
		cout<<"1-dobaviti"<<endl;
		cout<<"2-udaliti"<<endl;
		cout<<"Pres any another keys for exit"<<endl;
		int chose;
		cout<<"Chose=";
		cin>>chose;
		switch(chose){
			case 1:
				int add_place;
				do{
					cout<<"Vvedite posle kakogo el-ta dobaviti novii element: add_place=";
					cin>>add_place;
				}while(add_place>n || add_place<0);
				object->add(add_place,n);
				object->output();
			break;
			case 2:
				int del_place;
				do{
					cout<<"Vvedite kakoi element udaliti: del_place=";
					cin>>del_place;
				}while((del_place>n || del_place<0) && n != 0);
				if( n != 0){
					object->Del( del_place, n);
					object->output();
				}
				else
					cout<<"Spisok pust";
			break;
			case 3:
				object->output();
			break;
			default:
				exit=0;
		}
		getch();
	}
	getch();
	delete object;
}
void _2svz::Del(int del_place, int &n){
	list *p=head;
	if(del_place == 1){
		head=head->next;
		head->prev=tail;
		tail->next=head;
		delete p;
	}
	else{
		p=p->next;
		int i=2;
		while(i != del_place){
			p=p->next;
			i++;
		}
		list *prev_p, *next_p;
		prev_p=p->prev;
		next_p=p->next;
		if(del_place == n){
			prev_p->next=head;
			tail=prev_p;
			head->prev=tail;
		}
		else{
			prev_p->next=next_p;
			next_p->prev=prev_p;
		}
		delete p;
	}
	n--;
}
_2svz::_2svz(int n){
	list *p=new list;
	head=p;
	cout<<endl;
	for(int i=0;i<n-1;i++) {
		cout<<"num=";
		cin>>p->num;
		p->next=new list;
		p->next->prev=p;
		p=p->next;
	}
	cout<<"num=";
	cin>>p->num;
	tail=p;
	tail->next=head;
	head->prev=tail;
}
void _2svz::output()  {
	list *p=head;
	do{
		cout<<p->num<<" ";
		p=p->next;
	}
	while(p->next != head->next);
	cout<<endl;
}
void _2svz::add(int add_place,int &n){
	list *p=head;
	list *t=new list;
	cout<<"Vvedite el-t: num=";
	cin>>t->num;
	if(add_place != 0 && add_place != n){
		for (int i=1;i<add_place;i++)
			p=p->next;
		t->next=p->next;
		t->prev=p;
		p->next->prev=t;
		p->next=t;
	}
	if(add_place == 0){
		tail->next=t;
		t->prev=tail;
		t->next=p;
		p->prev=t;
		head=t;
	}
	if(add_place == n) {
		tail->next=t;
		t->prev=tail;
		t->next=head;
		head->prev=t;
		tail=t;
	}
	n++;
}
_2svz::~_2svz() {
	list* p;
	while(head!=tail){
	    p=head;
	    head=head->next;
	    delete p;
	}
	delete tail;
}
Соседние файлы в папке Списики