Слайд 2Линейный список в виде одномерного массива
Слайд 3Линейный список
в динамической памяти
Слайд 5Статические и динамические переменные
Слайд 6Функции для динамического распределения памяти
void *malloc(size_t size);
void *free(void *p);
char *c;
// Выделить память
10 байт
c=(char *)malloc(10);
// или
c=(char *)malloc(sizeof(char)*10);
Слайд 7Использование функций malloc() и free()
Слайд 8Пример 1. Создание массива
в динамической памяти
int *p, i;
p =
(int *) malloc(100 * sizeof(int));
if (p==NULL)
{
printf("Недостаточно памяти\n");
return 0;
}
for (i = 0; i < 100; i++)
*(p+i) = i;
for (i = 0; i < 100; i++)
printf("%d ", p[i] );
free(p);
Слайд 9Общее представление о списке в динамической памяти
Слайд 10Описание типа для построения линейного списка
Слайд 11Создание элементов в динамической памяти
struct element *nach, *pred, *tek;
nach=(struct element *)malloc(sizeof(struct element));
Слайд 12Обращение к полям структуры через указатель (в статической памяти)
struct date {
int
day;
char month[10];
int уear; };
struct date this_day, *db;
db = &this_day;
. . .
(*db).day = 25;
db -> day = 25;
Слайд 13Связывание элементов
pred -> link=tek; // обращение к полю link
//
структуры через указатель
Слайд 14Переприсваивание указателей
pred=tek; // pred и tek указывают на
// один
и тот же элемент
Слайд 15Алгоритм построения списка в прямом порядке
Слайд 16Продолжение. Алгоритм построения списка
в прямом порядке
Слайд 17Глобальные описания
struct element
{
int d;
struct element *link;
};
struct element
*nach; // Указатель на
// начало списка
Слайд 20Пример 2. Функция просмотра списка:
void prosmotr()
{
struct element *tek;
tek
= nach; // Встали на начало списка
while(tek != NULL) // Пока не конец списка
{
printf("%d", tek->d);
tek = tek->link; // Шаг по связи
}
}
Слайд 21Добавление элемента в начало списка
1. Создать новый элемент nov.
Ввести информационную часть nov->d.
2. Построить
связь:
nov->link=nach;
3. Новый элемент сделать начальным:
nach=nov;
Слайд 22Добавление элемента в середину списка
1. Заполнить связь 2 у элемента nov:
nov->link=tek->link;
2. Соединить tek и nov (связь 1):
tek->link=nov;
Слайд 23Добавление элемента в конец списка
1. pred->link=NULL;
2. free(pos);
Слайд 24Пример 3. Перемещение по списку
Фрагмент программы:
tek=nach;
while(tek->d != 'c')
tek=tek->link;
printf("%s",
tek->d);
Слайд 25Пример 4. Перемещение по списку
Что будет выведено на экран в результате выполнения
фрагмента программы:
tek=nach;
for(i=1; i<=4; i++)
tek=tek->link;
printf("%s", tek->d);