Операции над линейными списками. Лекция 6 презентация

Содержание

Слайд 2

Связывание элементов pred -> link = tek; // в адресную часть pred // присваивается значение tek

Связывание элементов

pred -> link = tek;  // в адресную часть

pred
// присваивается значение tek
Слайд 3

Переприсваивание указателей pred = tek; // pred и tek указывают

Переприсваивание указателей

pred = tek;  // pred и tek указывают на


// один и тот же элемент
Слайд 4

Шаг по связи tek = tek->link; // указателю tek присваивается // адрес следующего за tek элемента

Шаг по связи

 tek = tek->link; // указателю tek присваивается
// адрес

следующего за tek элемента
Слайд 5

Удаление элемента в начале списка udal = nach; nach=nach->link; free(udal);

Удаление элемента в начале списка

udal = nach;
nach=nach->link;
free(udal);

Слайд 6

Удаление элемента из середины списка pred->link=pred->link->link;

Удаление элемента из середины списка

pred->link=pred->link->link; 

Слайд 7

Удаление элемента в конце списка 1. pred->link=NULL; 2. free(pos);

Удаление элемента в конце списка

1. pred->link=NULL;
2. free(pos);

Слайд 8

Пример 1. Длинный доступ по связям printf("%s", nach->d); printf("%s", nach->link->d); printf("%s", nach->link->link->link->d);

Пример 1. Длинный доступ по связям

printf("%s", nach->d);
printf("%s", nach->link->d);
printf("%s", nach->link->link->link->d);

Слайд 9

Пример 2. Перемещение по списку Фрагмент программы: tek=nach; while(tek->d != 'c') tek=tek->link; printf("%s", tek->d);

Пример 2. Перемещение по списку

Фрагмент программы: tek=nach; while(tek->d != 'c')    tek=tek->link;

printf("%s", tek->d);
Слайд 10

Пример 3. Перемещение по списку Фрагмент программы: tek=nach; for(i=1; i link; printf("%s", tek->d);

Пример 3. Перемещение по списку

Фрагмент программы: tek=nach; for(i=1; i<=4; i++)    tek=tek->link;

printf("%s", tek->d);
Слайд 11

Пример 4. Перемещение по списку Фрагмент программы: tek=nach; while(tek->link != NULL) tek=tek->link; printf("%s", tek->d);

Пример 4. Перемещение по списку

Фрагмент программы:    tek=nach;    while(tek->link != NULL) tek=tek->link;   

printf("%s", tek->d);
Слайд 12

Пример 5. Перемещение по списку Фрагмент 1 программы (ошибка сегментирования):

Пример 5. Перемещение по списку

Фрагмент 1 программы (ошибка сегментирования):    tek=nach;    while(tek

!= NULL) tek = tek->link;    printf("%s", tek->d);

Фрагмент 2 программы:
tek=nach;   while(tek->link->link != NULL) tek = tek->link; printf("%s", tek->d);

Слайд 13

Алгоритм построения списка в обратном порядке

Алгоритм построения списка в обратном порядке

Слайд 14

Продолжение. Алгоритм построения списка в обратном порядке

Продолжение. Алгоритм построения списка в обратном порядке

Слайд 15

Начало программы построения списка в обратном порядке. Описания. Функция построения

Начало программы построения списка в обратном порядке. Описания. Функция построения списка в

обратном порядке (следующий слайд)

struct element    {      int d;      struct element *link;    };
struct element *nach; 

Слайд 16

void vvod_2( ) { struct element *tek; int i; tek

void vvod_2( )
{
  struct element *tek;
  int i;
  tek = NULL;

 scanf("%d", &i);
  while(i != 0)
  {
   nach=(struct element *)malloc(sizeof(struct element));
   nach->d = i;
   nach->link = tek;
   tek = nach;
   scanf("%d", &i);
}
}
Слайд 17

Функция просмотра списка void prosmotr() { struct element *tek; tek

Функция просмотра списка

void prosmotr()
{
  struct element *tek;
  tek =

nach; // Встали на начало списка
  while(tek != NULL)  // Пока не конец списка
  {
    printf("%d", tek->d);
    tek = tek->link; // Шаг по связи
   }
}
Слайд 18

Функция main() int main() { vvod_2(); prosmotr(); return 0; }

Функция main()

int main()
{
vvod_2();
prosmotr();
return 0;
}

Слайд 19

Рекурсивная функция просмотра списка void prosmotr_2( struct element *tek )

Рекурсивная функция просмотра списка

void prosmotr_2( struct element *tek )
{

if( tek != NULL )  
{
    printf("%d", tek->d);
    prosmotr2(tek->link);
   }
}
Обращение:
prosmort_2(nach);
Слайд 20

Стек в динамической памяти struct stack { int d; struct

Стек в динамической памяти

struct stack    {      int d;      struct stack *link;   

};
void push( struct stack**, int n);
int pop(struct stack**);
Слайд 21

int main() { struct stack *S; int i; scanf(“%d”, &i);

int main()
{ struct stack *S;
int i;
scanf(“%d”, &i);
while(i!=0)

{ push(&S, i);
scanf(“%d”, &i);
}
while(S!= NULL)
{ i=pop(&S);
printf(“%d “, i);
}
return 0;
}
Слайд 22

Функция заполнения стека void push(struct stack **S, int i) {

Функция заполнения стека

void push(struct stack **S, int i)
{
struct stack *tek;
tek

= (struct stack *)(malloc(sizeof(struct stack));
tek->d = i;
tek->link = *S;
*S = tek;
}
Слайд 23

Функция извлечения элемента из стека int pop(struct stack **S) {

Функция извлечения элемента из стека

int pop(struct stack **S)
{
struct stack

*tek;
int i;
tek= *S;
i=tek->d;
*S=(*S) ->link;;
return I;
}
Слайд 24

Списки с двумя связями

Списки с двумя связями

Слайд 25

Списки с двумя связями struct element { int d; struct

Списки с двумя связями

struct element
{
int d;
struct element *rlink, *llink;
};
struct

element *nach, *kon;
Слайд 26

Добавление элемента в середину двусвязного списка

Добавление элемента в середину двусвязного списка

Слайд 27

Связи tek -> right = sled; tek -> left =

Связи

tek -> right = sled;
tek -> left = pred;
pred ->right =

tek;
sled -> left= tek;
или (1) и (4):
tek -> right = pred -> right;
pred -> right -> left = tek;
Слайд 28

Списки с полутора связями

Списки с полутора связями

Имя файла: Операции-над-линейными-списками.-Лекция-6.pptx
Количество просмотров: 91
Количество скачиваний: 0