В функции stack_enqueue
у вас есть две строки:
node_t *n = (node_t*)malloc(sizeof(node_t));
s->head[s->count++] = *n;
Первая строка динамически выделяет память. Вторая строка копируется туда, куда указывает n
. Затем вы просто отбрасываете указатель n
и память, на которую он указывает. Это действительно утечка памяти.
Простое решение - добавить:
free(n);
после назначения.
Есть небольшая проблема с этим и всем вашим списком «реализация, потому что то, что у вас есть, на самом деле не список, а простой массив структурных объектов. Вы можете заменить соответствующие строки stack_enqueue
на, например:
s->head[s->count++].data = item;
, а затем вообще не беспокоиться о части списка (по сути, удалите элемент next
структуры вместе со всей обработкой «списка» ).
Думаю, вы неправильно понимаете цель упражнения. Если s->head
является указателем, его следует рассматривать не как массив, а как указатель на первый узел списка.
Таким образом, у вас будет что-то вроде
+---------+ +------------+ +-------------+ +-----------+
| s->head | -> | first node | -> | second node | -> ... -> | last node | --> NULL
+---------+ +------------+ +-------------+ +-----------+
То есть , s->head
указывает на первый узел. Указатель первого узла next
указывает на второй узел, et c.
В вашем текущем коде нет такой привязки узлов.
Если у вас есть проблемы с пониманием связанных списков, ваши учебники должны содержать информацию об этом, и ваш класс также должен был поднять это. И во всем Inte rnet должны быть миллионы ресурсов о том, как реализовать списки ручных дескрипторов.