Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование программ и программирование на С++ Часть 1. Структурное.pdf
Скачиваний:
18
Добавлен:
15.11.2022
Размер:
3.8 Mб
Скачать

Удаление элемента с заданным ключом осуществляется анало­ гично, но вместо условия

if(i==k-l) //проверка номера

нужно использовать условие:

if (p->next->key==KEY)//проверка ключа,

где KEY - заданный ключ. Ключ KEY передается как параметр функ­ ции удаления.

19.5. Добавление элемента с заданным номером

Для добавления в список элемента с номером к нужно поставить указатель на элемент с номером k - 1. Затем нужно создать новый элемент и поменять значения адресных полей таким образом, чтобы адресное поле нового элемента содержало адрес элемента с номером к, а адресное поле к - 1 элемента - адрес нового элемента (рис. 17).

Информационное Адресное

, „

пппо

к-и элемент списка

Новый элемент

Рис. 17. Добавление элемента с номером к

point* add_elem(point*beg, int NOM)

{

point*p=make_point() ;//создание нового //элемента

if (NOM==0)//добавление первого

//элемента

{

p->next=beg;//связываем новый элемент //со списком

beg=p;//меняем адрес beg return beg;

}

point*r=beg;//указатель для перехода //на нужный номер

/*проходим по списку до элемента с номером N0M-1

или до конца списка, если такого элемента нет*/ for(int i=0; i<NOM-l&& r!=0;i++)

r=r->next;

//если элемента с указанным номером в списке нет if (1г)

{

cout«"\nNot such NOM!"; //сообщение об ошибке return beg;

}

p->next=r->next;//связываем новый элемент со //списком

//связываем элемент с номером N0M-1 с новым //элементом

r->next=p; return beg;

19.6. Двунаправленные списки

Двунаправленный список имеет два адресных поля, которые указывают на следующий элемент списка и на предыдущий, поэтому двигаться по такому списку можно как слева направо, так и справа налево (рис. 18).

pred key next

Рис. 18. Двунаправленный список

//пример описания двунаправленного списка struct point //описание структуры

{

int

key;

//ключевое поле

//адресные

поля

point* pred,//адрес предыдущего элемента

*next;

//

адрес следующего элемента

};

 

 

Ниже рассматривается программа, которая создает двуна­ правленный список, выполняет удаление элемента с заданным номером, добавление элемента с заданным номером и печать по­

лученных списков

 

 

 

 

 

 

 

 

 

 

 

#in c lu d e c io s tr e a m .h >

 

 

 

 

 

 

 

 

s t r u c t

p o i n t

//о п и с а н и е

стр у к ту р ы

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

i n t

k ey ;

 

//к л ю ч е в о е

поле

 

 

 

 

 

p o in t*

p r e d ,* n e x t ;

 

 

 

//а д р е с н ы е

поля

 

};

 

 

 

 

 

 

 

 

 

 

 

 

 

//ф о р м и р о в а н и е

сп и ск а

 

 

 

 

 

 

 

 

p o i n t * m a k e _ l i s t ()

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

i n t

п ;

 

 

//к о л и ч е с т в о

эл ем ен то в

списка

c o u t « " n - ? " ;

 

 

 

 

 

 

 

 

 

 

c i n » n ;

 

 

 

 

 

 

 

 

 

 

 

 

 

p o in t* p , * r , * b eg ;

 

 

 

 

 

 

 

 

p=new

( p o i n t ) ;

/ / с о з д а т ь

первый

элемент

/* за п о м н и т ь

а д р е с в

перем енную

b e g ,

в

которой

х р а н и т с я н ач ал о с п и с к а * /

 

 

 

 

 

 

 

 

b eg = p ;

 

 

 

 

 

 

 

 

 

 

 

 

c o u t « " k e y - ? ,f;

 

 

 

 

 

 

 

 

 

c in > > p - > k e y ;

//з а п о л н и т ь

клю чевое

поле

 

p - > p r e d = 0 ;p - > n e x t= 0 ;//за п о м н и т ь

адресные

поля

//д о б а в и т ь

элем ен ты

в кон ец сп и ска

 

 

 

f o r ( i n t i = l ; i < n ; i + + )

 

 

 

 

 

 

 

 

 

 

r = n e w ( p o in t) ;

 

 

//н о в ы й

элем ент

 

 

 

c o u t< < " k e y - ? " ;

 

 

 

 

 

 

 

 

c i n » r - > k e y ;

//а д р е с н о е

поле

 

 

 

 

 

p - > n e x t= r ;

/ / с в я з а т ь

н ач ал о

сп и ска

с г

 

r - > p r e d = p ;

/ / с в я з а т ь

г

с началом

списка

 

r-> n e x t= 0 ;

//о б н у л и ть

последнее

адресное

поле

р = г ; //п е р е д в и н у т ь

р

на

последний

элемент

//с п и с к а

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

r e t u r n

b e g ; //в е р н у т ь

первый

элем ен т

списка

//п е ч а т ь

сп и ска

 

 

 

 

 

 

v o id

p r i n t _ l i s t ( p o i n t

*beg)

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

i f

(beg==0)

/ /е с л и

сп и сок

п устой

 

{

 

 

 

 

 

 

 

 

 

 

 

c o u t « " T h e l i s t i s e m p ty \n " ;

 

 

 

 

r e t u r n ;

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

p o in t* p = b e g ;

 

 

 

 

 

 

 

w h ile (p )

 

//п о к а

не конец

сп и ска

 

{

 

 

c o u t « p - > k e y < < " \ t " ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p = p -> n e x t;

//п е р е й т и

на

следующий

//э л е м е н т

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

c o u t< < " \n " ;

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

//у д а л е н и е

эл ем ен та

с номером

к

 

 

p o in t* d e l _ p o i n t ( p o i n t * b e g , i n t к)

 

{

 

 

 

 

 

 

 

 

 

 

 

p o i n t

*p= beg;

 

 

 

 

 

 

i f ( k = = 0 ) //у д а л и т ь

первый элем ен т

 

{

 

 

 

 

 

 

 

 

 

 

 

//п е р е с т а в и т ь

н а ч а л о

с п и с к а

н а

следующий

//э л е м е н т

 

 

 

 

 

 

 

 

 

 

 

 

 

b e g = b e g - > n e x t;

 

 

 

 

/ /е с л и

в

сп и ске то л ьк о один

элем ен т

 

 

 

 

if ( b e g = = 0 ) r e t u r n 0;

 

 

 

 

 

 

 

/ /е с л и

в сп и ске б о лее

одного

элем ен та

 

 

 

b e g -> p re d = 0 ;//о б н у л и ть

адрес предыдущего

//э л е м е н т а

 

 

 

 

 

 

 

 

 

 

 

 

d e l e t e

р ;

 

//у д а л и т ь

первый

 

 

 

r e t u r n

b e g ;

//в е р н у т ь

н ач ал о

сп и ска

}

 

 

 

 

 

 

 

 

 

 

 

/* е с л и

у д а л я е т с я элем ен т и з

середины

сп и ск а,

пройти

по

сп и ску либо

до

эл ем ен та

с

предыдущим но­

мером,

либо

до

конца с п и с к а * /

 

 

 

 

f o r ( i n t

i= 0 ;i< k - l& & p ! = 0 ;i+ + ,p = p - > n e x t) ;

 

 

/ / е с л и

в с п и ск е

 

н ет

 

э л е м ен т а

с

 

номером

к

 

i f ( р = = 0 ||p - > n e x t= = 0 ) r e tu r n

b e g ;

 

 

 

 

 

/ / е с л и

в с п и ск е

 

е с т ь эл ем ен т

с

 

номером

к

 

p o i n t e r

р _ ^ n e x tf

 

/ /в с т а т ь

на

удаляемый

элемент

p - > n e x t= r - > n e x t;

 

 

 

//и з м е н и т ь

ссылку

 

 

 

d e l e t e

г ;

 

 

 

 

 

 

 

 

//у д а л и т ь

г

 

 

r = p - > n e x t ;

 

 

 

 

 

/ / в с т а т ь

на

следующий

/ / е с л и

г

с у щ е с т в у е т ,

то

с в я з а т ь

элементы

 

i f (г != 0 )r - > p r e d = p ;

 

 

 

 

 

 

 

 

 

 

 

r e t u r n

b e g ;

 

 

 

 

 

//в е р н у т ь

начало

 

списка

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//д о б а в и т ь

эл е м ен т

с

номером

к

 

 

 

 

 

 

p o i n t * a d d _ p o i n t ( p o i n t * b e g ,i n t к)

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p o i n t

* p ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/ / с о зд а т ь

новый

 

элем ент и

заполнить ключевое поле

p = n e w ( p o in t) ;

 

 

 

 

 

 

 

 

 

 

 

 

 

c o u t « " k e y - ? " ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

c in > > p - > k e y ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i f ( k = = 0 ) / / е с л и

д о б а в л я е т с я

первый

 

элемент

{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p - > n e x t= b e g ;

 

 

 

 

//д о б а в и т ь

 

перед

beg

 

p - > p r e d = 0 ;

//о б н у л и т ь

 

ад р ес

 

предыдущего

/ / с в я з а т ь

сп и со к

с

добавленны м

 

элементом

 

 

 

b e g - > p re d = p ;

 

 

 

 

 

 

 

 

 

 

 

b e g = p ;//з а п о м н и т ь

первый элемент

в beg

 

 

r e t u r n

 

b e g ; //в е р н у т ь

н ачало

списка

}

 

/ / е с л и

 

д о б а в л я е т с я элем ент

в

середину

 

 

 

/ / и л и ко н ец с п и ск а

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p o i n t* r = b e g ;

 

 

 

 

/ / в с т а т ь

на

начало

списка

/* п р о й т и

по

сп и ск у

либо

до конца сп и ска,

либо

до э л е м е н т а

с

номером

к - 1 * /

 

 

 

 

 

 

 

 

 

f o r (i n t

i = 0 ; i< k - l& & r - > n e x t! =0; i+ + , r = r - > n e x t);

p - > n e x t = r - > n e x t ; / / с в я з а т ь

p с

концом

списка

/ / е с л и

эл е м ен т

не

п о сл ед н и й ,

то

с в я з а т ь

 

конец

// с п и с к а с

р

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i f ( r - > n e x t != 0 )r - > n e x t- > p r e d = p ;

 

p - > p r e d = r;

/ / с в я з а т ь р и г

 

r - > n e x t= p ;

 

 

 

 

r e t u r n b e g ;

//в е р н у т ь

н ач ал о

сп и ска

}

 

 

 

 

 

v o id

m a in ()

 

 

 

 

{

 

 

 

 

 

p o in t* b e g ;

 

 

 

 

i n t

i , k ;

 

 

 

 

do

 

 

 

 

 

{

//п е ч а т ь

меню

 

 

 

 

 

 

c o u t « " 1 .Make l i s t \ n M;

 

 

c o u t « " 2 . P r i n t l i s t \ n M;

 

c o u t « f,3 .A dd p o i n t \ n " ;

 

 

c o u t « " 4 . D e le te p o i n t \ n " ;

 

c o u t< < " 5 . E x i t \ n " ;

 

 

c in > > i;

//в в о д

вы бранного п ункта меню

 

s w i t c h ( i )

 

 

 

{

 

 

 

 

 

c a s e

1 : //ф о р м и р о ван и е

сп и ска

 

{

 

 

 

 

b e g = m a k e _ lis t( ) ;

 

 

 

b re a k ;

 

 

 

 

}

c a s e

2 : //п е ч а т ь

сп и ска

 

 

 

 

{

 

 

 

 

p r i n t _ l i s t ( b e g ) ;

 

 

 

b r e a k ;

 

 

 

 

}

c a s e

3 : //д о б а в л е н и е эл ем ен та

 

 

{

c o u t « ,,\ n k - ? ” ;

 

 

 

 

c i n » k ;

 

 

 

 

 

 

b e g = a d d _ p o in t( b e g ,k ) ;

 

 

b r e a k ;

 

 

 

}

 

 

 

 

 

c a s e

4 : //у д а л е н и е эл ем ен та

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]