Скачать презентацию Связанные списки это структура данных с помощью которой Скачать презентацию Связанные списки это структура данных с помощью которой

progr_su_6.ppt

  • Количество слайдов: 21

Связанные списки это структура данных, с помощью которой можно хранить последовательность объектов или значений, Связанные списки это структура данных, с помощью которой можно хранить последовательность объектов или значений, длина списка не фиксируется, элементы списка связаны друг с другом по определенному правилу определены правила обработки списка (добавление/удаление элементов и т. д. )

Элемент списка Структура, содержащая: • информационное поле (или поля) • поле (поля) связи — Элемент списка Структура, содержащая: • информационное поле (или поля) • поле (поля) связи — указатели Info Link

Виды списков Односвязные списки стек (LIFO) очередь (FIFO) циклический список Двусвязные списки Структура типа Виды списков Односвязные списки стек (LIFO) очередь (FIFO) циклический список Двусвязные списки Структура типа «стек»

Действия над списком Создание списка Добавление узла Удаление узла Просмотр списка Очистка списка Поиск Действия над списком Создание списка Добавление узла Удаление узла Просмотр списка Очистка списка Поиск элемента в списке Сортировка списка

Пример использования структуры типа «стек» Написать программу, использующую для хранения целых чисел структуру данных Пример использования структуры типа «стек» Написать программу, использующую для хранения целых чисел структуру данных типа стек. Функции программы: добавление элемента в стек, удаление элемента из стека, просмотр содержимого стека, очистка стека.

Структура данных для создания элемента списка struct node { int number; struct node* link; Структура данных для создания элемента списка struct node { int number; struct node* link; }; struct node* add_item(struct node* top); void print_stack(struct node* top); struct node* del_item(struct node* top);

Создание первого элемента списка int _tmain(int argc, _TCHAR* argv[]) { struct node* top=NULL; //вершина Создание первого элемента списка int _tmain(int argc, _TCHAR* argv[]) { struct node* top=NULL; //вершина стека struct node* item=NULL; item=(struct node*)malloc(sizeof(struct node)); item->link=NULL; //дно стека item->number=1; //хранимое значение top=item; //. . . return 0; }

Добавление элемента в список struct node* add_item(struct node* top) { struct node* newitem; static Добавление элемента в список struct node* add_item(struct node* top) { struct node* newitem; static int value=2; newitem=(struct node*)malloc(sizeof(struct node)); newitem->link=top; newitem->number=value++; return newitem; }

Просмотр списка void print_stack(struct node* top) { if(top==NULL) printf( Просмотр списка void print_stack(struct node* top) { if(top==NULL) printf("List is empty"); while (top!=NULL) { printf("%6 d", top->number); top=top->link; } printf("n"); }

Удаление элемента с вершины стека struct node* del_item(struct node* top) { if(top==NULL) printf( Удаление элемента с вершины стека struct node* del_item(struct node* top) { if(top==NULL) printf("Empty listn"); else { struct node* item=top; top=top->link; free(item); } return top; }

Очистка списка struct node* del_stack(struct node* top) { struct node *item=top; while (item!=NULL) { Очистка списка struct node* del_stack(struct node* top) { struct node *item=top; while (item!=NULL) { top=top->link; free(item); printf("delete!n"); item=top; } return item; }

int _tmain(int argc, _TCHAR* argv[]) { struct node *top=NULL; struct node *item=NULL; int i; int _tmain(int argc, _TCHAR* argv[]) { struct node *top=NULL; struct node *item=NULL; int i; item=(struct node*)malloc(sizeof(struct node)); item->link=NULL; item->number=1; top=item; for(i=1; i<5; i++) top=add_item(top); print_stack(top); top=del_stack(top); if (top==NULL) printf("emptyn"); return 0; }

Результат работы программы Результат работы программы

Список типа «очередь» (линейный список) NULL Правый указатель (хвост списка) Список типа «очередь» (линейный список) NULL Правый указатель (хвост списка)

Создание очереди struct node { int number; struct node* link; }; struct node* add_item(struct Создание очереди struct node { int number; struct node* link; }; struct node* add_item(struct node* right); void print_list(struct node* left); struct node* del_list(struct node* left, struct node** right);

int _tmain(int argc, _TCHAR* argv[]) { struct node *left=NULL, *right=NULL; struct node* firstitem=(struct node*)malloc(sizeof(struct int _tmain(int argc, _TCHAR* argv[]) { struct node *left=NULL, *right=NULL; struct node* firstitem=(struct node*)malloc(sizeof(struct node)); firstitem->number=1; firstitem->link=NULL; left=firstitem; right=firstitem; int i; for(i=0; i<5; i++) right=add_item(right); print_list(left); left=del_list(left, &right); printf("left %p right %pn", left, right); return 0; }

Добавление элемента в очередь struct node* add_item(struct node* right) { static int num=2; struct Добавление элемента в очередь struct node* add_item(struct node* right) { static int num=2; struct node* newitem=(struct node*)malloc(sizeof(struct node)); newitem->number=num++; newitem->link=NULL; right->link=newitem; return newitem; }

Просмотр элементов очереди void print_list(struct node* left) { if(left==NULL) printf( Просмотр элементов очереди void print_list(struct node* left) { if(left==NULL) printf("List emptyn"); else { while(left!=NULL) { printf("%6 d", left->number); left=left->link; } printf("n"); } }

Очистка очереди struct node* del_list(struct node* left, struct node** right) { struct node* tmp; Очистка очереди struct node* del_list(struct node* left, struct node** right) { struct node* tmp; while(left!=NULL) { tmp=left; left=left->link; free(tmp); } *right=NULL; return left; }

Циклический список Циклический список

Двусвязный список Удаление элемента из списка Левый указатель Правый указатель NULL Двусвязный список Удаление элемента из списка Левый указатель Правый указатель NULL