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

Содержание

Слайд 2

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

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

// присваивается значение tek

Слайд 3

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

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

один и тот же элемент

Слайд 4

Шаг по связи

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

tek элемента

Слайд 5

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

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

Слайд 6

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

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

Слайд 7

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

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);

Слайд 9

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

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

Слайд 10

Пример 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);


Слайд 12

Пример 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 = 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 = nach; //

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

Слайд 18

Функция main()

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

Слайд 19

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

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 stack *link;    };
void push( struct

stack**, int n);
int pop(struct stack**);

Слайд 21

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)
{
struct stack *tek;
tek = (struct

stack *)(malloc(sizeof(struct stack));
tek->d = i;
tek->link = *S;
*S = tek;
}

Слайд 23

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

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 element *rlink, *llink;
};
struct element *nach,

*kon;

Слайд 26

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

Слайд 27

Связи

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
Количество просмотров: 80
Количество скачиваний: 0