Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СА_МВ_ДЗ_ЛР_1.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
432.13 Кб
Скачать

Неповні оголошення структур

Іноді кілька структур посилаються одна на одну за допомогою своїх членів-покажчиків. Необхідно оголосити структури до їх використання, але не можна сформувати їх усі друг перед другом.

Щоб вирішити цю проблему, використовується неповне оголошення структури, що починається як звичайно, але не має тіла:

struct BStruct; // Неповне оголошення структури типу BStruct

struct AStruct { // Оголошення структури типу AStruct

struct BStruct *bp; }; // Покажчик на тип BStruct

struct BStruct { // Оголошення структури BStruct

struct AStruct *ap; }; // Покажчик на тип AStruct

Стеки

Стек – це структура даних, що працює за принципом: останнім прийшов, першим вийшов. Стек нагадує стопку книг. Верхню книгу взяти легко, але щоб дістати нижні книги, потрібно забрати ті, які перебувають зверху. Наступний лістинг показує, як використовувати список для побудови стеків зі структур типу Item.

#define FALSE 0;

#define TRUE 1;

// Оголошення структури покажчиків дивися вище

void Push(Iptr newitem, Iref list); // Функція занесення елемента в стек

void Pop(Iref newitem, Iref list); // Функція вилучення елемента

void AddItem(void); // Функція додавання елемента

void DelItem(void); // Функція видалення елемента

void ShowList(Iptr p); // Функція виводу списку

void Display(void); // Функція виводу стека

Iptr avail; // Покажчик на стек avail

Iptr ilist; // Покажчик на стек item

main( ) {

int done = = FALSE;// Якщо done = = TRUE, програма завершується

int c; // Символ команди користувача

while (!done) {

Display( );

gotoxy(1, 25); cprintf("Уведіть символ A-dd, D-elete, Q-uit");

c = getch( ); // Уведення символу (виду функції)

switch (toupper(c)) {

case 'A': AddItem( ); break;

case 'D': DelItem( ); break;

case 'Q': done = = TRUE; break;}

}

return 0;}

Функція Push() привласнює члену next нового елемента адрес, який зберігається в list та передається у функцію як покажчик на покажчик на тип Item. Після цього вміст покажчика list заміняється адресою нового елемента аналогічно тому, як виконувалася вставка в список нового елемента.

void Push(Iptr newitem, Iref list){ // Занесення нового елемента в список

newitem->next = *list; // Член next зараз вказує на list

*list = newitem; } // list зараз указує на новий елемент

Функція Pop() виконує зворотну операцію, видаляючи один елемент зі стека та коректуючи покажчик, змушуючи його адресувати наступний елемент у черзі. Якщо список порожній, функція Pop() виділяє місце для нового елемента.

void Pop(Iref newitem, Iref list) { // Вилучення newitem зі списку

// або створення нового елемента, якщо список порожній

if (*list = = NULL) { // Якщо список порожній...

*newitem=malloc(sizeof(struct item)); //Динамічне створення елемента

(*newitem)->data = -1; //Ініціалізувати data, значенням рівним -1

} else { // Інакше...

*newitem = *list; // Повернення елемента, що перебуває у вершині списку

*list = (*list)->next; } } // Коректування списку

void AddItem(void) { // Додавання елемента в стек

Iptr newitem; // Покажчик на структуру типу Item

Pop(&newitem, &avail); // Одержати або створити новий елемент

if (newitem->data < 0) // Якщо це новий елемент (data = - 1)

newitem->data = rand( ); // Привласнити data випадкове число

Push(newitem, &ilist); } // Занести новий елемент у стек item

void DelItem(void) { // Видалити елемент зі стека item

// і зберегти цей же елемент у стеці avail

Iptr newitem;

Pop(&newitem, &ilist); // Одержати новий елемент зі стека item

Push(newitem, &avail); } // Зберегти елемент у стеці avail

void ShowList(Iptr p) { // Відобразити вміст списку p

while (p != NULL) { // Поки не досягнуть кінець списку

gotoxy(1, wherey( ) + 1);

cprintf("%d", p->data);

p = p->next; } } // Адресувати наступний елемент у списку

void Display(void) { // Відобразити стеки avail й item

clrscr( ); gotoxy(1, wherey( ) + 1); cprintf("Avail list: ");

ShowList(avail);

gotoxy(1, wherey( ) + 2); cprintf("Item list:");

ShowList(ilist); }