Лабораторная работа №2.
Тема: Списки.
Одномерный список.
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
class cls_list{
private:
struct list{
int number;
list *next;
};
list *head;
public:
cls_list(int n);
void output();
void Delete(int del_place, int n);
void add(int add_place, int &n, int number);
int if_empty();
~cls_list();
};
void main(){
clrscr();
cls_list *object=NULL;
int n;
while(1){
cout<<endl<<"1-vvod"<<endl;
cout<<"2-vivod"<<endl;
cout<<"3-dobavit'"<<endl;
cout<<"4-udalit' 1 element"<<endl;
cout<<"5-udalit' spisok"<<endl;
cout<<"chose=";
int chose1;
cin>>chose1;
if(chose1==1){
if(object->if_empty()==0 && object==NULL){
do{
clrscr();
cout<<"n=";
cin>>n;
}while(n<=0);
object=new cls_list(n);
}
else{
cout<<"Your list is not empty. Do you want add any new elements?\n 1-Yes\n Any key = no\n";
char chose;
cin>>chose;
if(chose == '1'){
int add_place, number;
do{
clrscr();
cout<<"Na mesto kakogo elementa dobavit'?";
cin>>add_place;
cout<<"n=";
cin>>number;
}while(add_place-1 > n || add_place <=0);
object->add( add_place, n, number);
}
}
}
else if(chose1 == 2){
if(object==NULL)
cout<<"Your list is empty\n";
else
object->output();
getch();
}
else if(chose1==3){
if(object==NULL)
cout<<"Your list is empty\n";
else{
Int add_place, number;
do{
clrscr();
cout<<"Na mesto kakogo elementa dobavit'?";
cin>>add_place;
cout<<"n=";
cin>>number;
}while(add_place-1 > n || add_place <=0);
object->add( add_place, n, number);
}
getch();
}
else if(chose1 == 4){
if(object==NULL)
cout<<"Your list is empty\n";
else{
int del_place;
do{
clrscr();
cout<<"Which element is delete?: ";
cin>>del_place;
}while(del_place > n || del_place < 0);
object->Delete( del_place, n);
}
getch();
}
else if(chose1 == 5){
if(object==NULL)
cout<<"Your list is empty\n";
else
delete object;
object=NULL;
}
else{
delete object;
exit(1);
}
}
if(!object->if_empty())
delete object;
}
cls_list::cls_list(int n){
head=new list;
int i=1;
list *p;
p=head;
while(i<n){
cout<<"Input number: ";
cin>>p->number;
i++;
p->next=new list;
p=p->next;
}
cout<<"Input number: ";
cin>>p->number;
p->next=NULL;
}
cls_list::~cls_list(){
list *p;
while(head!=NULL){
p=head;
head=head->next;
delete p;
}
}
void cls_list::add(int add_place, int &n, int number){
list *temp=new list;
temp->number=number;
if(add_place==1){
temp->next=head;
head=temp;
}
else{
list *prev_p;
list *p;
prev_p=head;
p=head->next;
for(int i=1;i<add_place-1;i++){
prev_p=prev_p->next;
p=p->next;
}
prev_p->next=temp;
temp->next=p;
}
n++;
}
void cls_list::output(){
list *p=head;
while(p!=NULL){
cout<<p->number<<" ";
p=p->next;
}
}
void cls_list::Delete(int del_place, int n){
if(del_place <= n && del_place > 0){
list *p;
p=head;
n--;
if(del_place == 1){
head=head->next;
delete p;
}
else{
list *prev_p;
prev_p=head;
p=p->next;
int i=2;
while(i != del_place){
p=p->next;
prev_p=prev_p->next;
i++;
}
prev_p->next=p->next;
delete p;
}
}
}
int cls_list::if_empty(){
if(head->next == NULL) return 0;
else return 1;}
Скрин.
Ввод и вывод.
Циклический односвязный список.
#include<iostream.h>
#include<conio.h>
class _1svz{
private:
struct list{
int num;
list* next;
};
list* head,* tail;
public:
_1svz(int n);
~_1svz();
Void output();
void add(int add_place, int &n);
void Del(int del_place, int &n);
};
Void main(){
int n;
do{
clrscr();
cout<<"Vvedite kol-vo elementov n=";
cin>>n;
}while(n<=0 || n>100);
_1svz *object=new _1svz(n);
object->output();
cout<<endl;
int exit=1;
while(exit == 1){
clrscr();
cout<<"1-dobaviti"<<endl;
cout<<"2-udaliti"<<endl;
cout<<"3-vivod"<<endl;
cout<<"Pres any another keys for exit"<<endl;
char chose;
chose=getch();
cout<<chose<<endl;
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();
default:
exit=0;
break;
}
getch();
}
delete object;
}
void _1svz::Del(int del_place, int &n){
list *p=head;
if(del_place == 1){
head=head->next;
tail->next=head;
delete p;
}
else{
list *prev_p=head;
p=p->next;
int i=2;
while(i != del_place){
p=p->next;
prev_p=prev_p->next;
i++;
}
prev_p->next=p->next;
delete p;
if(i == n){
tail=prev_p->next;
tail->next=head;
}
}
n--;
}
_1svz::_1svz(int n){
int y;
list *p=new list;
head=p;
cout<<endl;
for(int i=0; i<n ;i++){
cout<<"num=";
cin>>p->num;
p->next=new list;
p=p->next;
tail=p;
}
tail->next=head;
}
void _1svz::output(){
list *p=head;
while(p->next!=head){
cout<<p->num<<" ";
p=p->next;
}
}
void _1svz::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){
for(int i=1;i<add_place;i++)
p=p->next;
t->next=p->next;
p->next=t;
if(add_place==n)
tail=t;
}
if(add_place==0){
tail->next=t;
t->next=p;
head=t;
}
n++;
}
_1svz::~_1svz(){
list *p;
while(head!=tail){
p=head;
head=head->next;
delete p;
}
delete tail;
}
Скрины.
Двусвязный список.
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
class cls_list{
private:
struct list{
int number;
list *next;
list *prev;
};
list *head, *tail;
public:
cls_list(int n);
void output();
void Delete(int del_place, int &n);
void add(int add_place, int &n, int number);
int if_empty();
~cls_list();
};
void main(){
clrscr();
cls_list *object=NULL;
int n;
while(1){
cout<<"1 - vvod"<<endl;
cout<<"2 - vivod"<<endl;
cout<<"3 - dobavit'"<<endl;
cout<<"4 - udalit' 1 element"<<endl;
cout<<"5 - udalit' spisok"<<endl;
cout<<"chose=";
cin>>chose1;
if(chose1 == 1){
if(object->if_empty()==0 && object==NULL){
do{
clrscr();
cout<<"n=";
cin>>n;
}while(n<=0);
object=new cls_list(n);
}
else{
cout<<"Your list is not empty. Do you want add any new elements?\n 1-Yes\n Any key = no\n";
char chose;
cin>>chose;
if(chose == '1'){