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

int key;

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

поле

point* next;

//адресное

поле

};

//создание элемента point* make_point()

{

point*p=new(point);//выделить память под

//элемент списка cout«"\nEnter the key";

cin»p->key;//заполнить информационное поле p->next=0;//сформировать адресное поле

return р;//вернуть указатель на созданный элемент

}

19.2. Создание списка из п элементов

Для того чтобы создать список из п элементов, нужно создать первый элемент с помощью рассмотренной выше функции make_point (), а затем добавить в список оставшиеся (п - 1) эле­ менты. Добавление может осуществляться либо в начало списка, ли­ бо в конец списка. При добавлении элемента в начало списка элемен­ ты списка будут располагаться в порядке, обратном тому, в котором элементы вводились, так как тот элемент, который был введен пер­ вым, в списке окажется последним.

Сформирование списка из п элементов путем до­

бавления элементов в начало списка*/ point* make_list(int n)

{

point* beg=make_point();//сформировать первый //элемент

point*r;//вспомогательная переменная для //добавления

for(int i=l;i<n;i++)

{

//сформировать следующий

r=make_point();

//элемент

 

//добавление в начало списка r->next=beg; //сформировать

//адресное поле

b e g = r;

//и з м е н и т ь

а д р е с п ер в о го

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

 

 

}

 

 

r e t u r n b e g ;

//в е р н у т ь а д р е с

н а ч а л а сп и ска

}

Можно добавлять элементы не в начало, а в конец списка, тогда

порядок элементов не изменится.

 

 

 

 

 

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

сп и ска и з

п эл ем ен то в

п утем д о ­

б авлен и я

эл ем ен то в

в

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

 

 

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

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

lf(n = = 0 )

r e t u r n

0 ; //с п и с о к

п у сто й

 

 

p o in t*

b e g = m a k e _ p o in t( ) ; //с ф о р м и р о в а т ь

первый

//э л е м е н т

 

 

 

 

 

 

 

 

 

 

 

 

i f (n==l)

r e t u r n

b e g ; //с п и с о к

и з одного

элем ен та

p o i n t * r ,

 

//н о в ы й

 

эл ем ен т

сп и ска

 

 

//у к а з а т е л ь

д ля

х р ан ен и я

а д р е с а п о с л е д н е го

//э л е м е н т а

сп и ска

 

 

 

 

 

 

 

 

*q;

 

 

 

 

 

 

 

 

 

 

 

 

q = b e g ;//п о с т а в и л и

 

у к а з а т е л ь q

на первый

элем ент

f o r ( i n t

 

i = l ;

i< n ;i+ + )

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

r= m a k e _ p o in t( ) ;

 

 

 

//с ф о р м и р о в ал и следующий

//э л е м е н т

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//д о б а в л е н и е

в кон ец

сп и ск а

 

 

//эл е м е н т о м

 

q - > n e x t= r ;

/ / с в я з а л и

сп и со к

с

новым

 

 

 

 

 

 

 

 

 

 

 

 

 

 

q = r;

//и з м е н и т ь

а д р е с п о сл ед н его

//э л е м е н т а

сп и ска

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

r e t u r n

b e g ;

//в е р н у т ь

а д р е с н ач ал а

сп и ска

19.3. Перебор элементов списка

Чтобы перебрать элементы списка, нужно встать на первый эле­ мент p=beg и переходить от одного элемента к следующему, исполь­ зуя адресное поле next: p = p -> n e x t, до тех пор пока список не закон­ чится, т.е. р не приобретет нулевое значение. При обходе выполняется

обработка ключевого поля списка. Рассмотрим перебор элементов спи

ска на примере функции печати.

 

 

 

 

v o id

p r i n t _ l i s t ( p o i n t * b e g ) //п е ч а т ь

сп и ска

{

 

 

 

 

 

 

p o in t* p = b e g ;//в с т а л и

на н ач ал о

сп и ска

//п р о в е р к а

нали чи я эл ем ен то в

в

сп и ске

i f

(!р )

{c o u t< < " \n T h e

l i s t

i s

e m p ty !" ;

r e t u r n ; }

 

 

 

 

 

 

w h ile ( p ) //п о к а значение

p не стан ет равно нулю

{

 

 

 

 

 

 

co u t< < p -> k ey < < " " ; //в ы в о д

клю чевого поля

p = p - > n e x t;//п е р е х о д к

следующему

элем ен ту

//с п и с к а

 

 

 

 

 

 

}

 

 

 

 

 

 

19.4. Удаление элемента с заданным номером

Чтобы удалить элемент с заданным номером (например, с номе­ ром к), нужно поставить указатель на элемент с номером k - I и изменить его адресное поле, присвоив ему значение адреса элемен­ та с номером к + 1. Затем элемент с номером к удаляется с помощью функции d e l e t e (рис. 16).

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

Beg - начало списка

Рис. 16. Удаление элемента из списка

/ /У даление и з однонаправленного списка элемента / / с номером к

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

{

/^ п о с т а в и т ь всп о м о гательн у ю переменную на на­ ч ал о с п и с к а * /

p o in t* p = b e g ;

 

 

 

 

 

 

 

p o i n t

* r ;

 

//в с п о м о г а т е л ь н а я п ерем ен ная

// д л я

у д ал ен и я

 

 

 

 

 

 

 

 

i n t i= 0 ;

 

//с ч е т ч и к

элем ен то в в

сп и ске

 

if(k = = 0 )

 

//у д а л и т ь

первый

элем ен т

 

 

{

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

d e l e t e

р ;

 

//у д а л и т ь

элем ен т

/ / и з

сп и ска

 

 

 

 

 

 

 

 

 

 

 

 

r e t u r n

b e g ;

//в е р н у т ь

ад р ес

//п е р в о г о

эл ем ен та

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

w h i l e ( р ) //п о к а

н ет

конца

сп и ска

 

 

{

 

 

 

 

 

 

 

 

 

/ * дошли до

эл ем ен та с

номером

к - 1 ,

чтобы поме­

н ять

е го

поле

n e x t* /

 

 

 

 

 

 

i f ( i = = k - l )

 

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

/^ п о с т а в и т ь

г

на

удаляемы й

эл е м ен т * /

r = p - > n e x t;

 

 

 

 

 

 

 

 

i f

(г)

/ / е с л и

р

не последний

элем ен т

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

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

//и ск л ю ч и ть г

/ / и з

сп и ска

 

 

 

 

 

 

 

 

 

 

 

 

d e l e t e

г ;

 

//у д а л и т ь

элем ен т

/ / и з

сп и ска

 

 

 

 

 

 

 

 

}

/* е с л и р - последний эл ем ен т, то в поле n e x t п рисвои ть О*/

 

e l s e p -> n e x t= 0 ;

 

}

 

 

p = p - > n e x t;

//п е р е х о д к следующему

элем ен ту

i+ + ;

//у в е л и ч и т ь

сч етч и к

//э л е м е н т о в

}

r e t u r n b e g ; //в е р н у т ь а д р е с п ер в о го элем ен та

}

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