Организация данных в виде стека.
Понятие стека ("магазина"): первый пришел, последний ушел.
LIFO (LAST IN FIRST OUT)
Описание стека как списка:
typedef struct _LIST {
info_t info; /* тип данных для информации */
struct _LIST *next;
} LIST;
В вызывающей функции стек должен быть описан так:
LIST *head = NULL; /* голова списка */
Действия со стеком определяется несколькими функциями:
1. Помещение элемента в стек (в голову списка)
void add_head (LIST *head, info_t a)
{
LIST *t;
if (t=(LIST*) malloc (sizeof (LIST)))
{
t->info = a; /* 1 */
t->next = (*head); /* 2 */
(*head) = t; /* 3 */
}
}
t .......... 2
: 1 a : :
..........
......... ......... ..........
3 : : : : : : : :NULL:
......... ......... ..........
head 3
2. Извлечение из стека (из головы списка)
info_t get_head (LIST *head)
{
LIST *t; info_t a;
if ( *head)
{
a = (*head)->info; /* 1 */
t = (*head); /* 2 */
(*head) = (*head)->next; /* 3 */
free (t);
}
return a;
}
t 2
.......... ......... ..........
: 1 a : : : : : : :NULL:
.......... ......... ..........
head 3
Организация данных в виде очереди.
Понятие очереди: первый пришел, первый ушел.
FIFO (FIRST IN FIRST OUT).
Описание очереди: такое же, что и стека, но надо хранить и начало и хвост очереди.
.......... ......... ..........
head : : : : : : : :NULL:
.......... ......... ..........
tail
Тогда в вызывающей программе очередь описывается так:
LIST *head = NULL, *tail = NULL;
Помещение элемента в очередь (в хвост списка):
1-ый элемент: head
3 ..........
: :NULL:
5 ..........
tail t
Остальные: ......... ......... .........
: : : : : : : : :
......... ......... .........
head 5 4
tail ...........
5 :1 a:NULL:
...........
t 2
void add_tail (LIST*head, LIST*tail, info_t a)
{
LIST*t;
if (t = (LIST*) malloc (sizeof (LIST)))
{
t->info = a; /* 1 */
t->next = NULL; /* 2 */
if (*head) == NULL) (*head) = t; /* 3 */
else (*tail)->next = t;/* 4 */
(*tail) = t; /* 5 */
}
}
Дата добавления: 2014-12-18; просмотров: 596;