LINUX.ORG.RU

История изменений

Исправление KennyMinigun, (текущая версия) :

slist_delete()

- if(l->size > 0) {
+ if(l->free_data && l->size > 0) {

slist_append()

+ if (! l) {
+     l = slist_new();
+     if (! l) return NULL; 
+ }
  snode* n = slist_node_new();
Или более дерзкий вариант:
+ if (! l && !(l = slist_new())) return NULL;
  snode* n = slist_node_new();
... ну и аналогичные рекомендации применимы к аналогичным функциям

Вот так. Потому, что:

  1. не всегда требуется деструктор (например, данные могут быть внешними по отношению к контейнеру)
  2. список — это абстракция, главное — данные, что в нём хранятся. Поэтому добавление существующего элемента в несуществующий список можно считать созданием списка (аналогичное применимо и к удалению последнего элемента, но только если не нужно отличать ситуацию когда список пуст от ситуации, когда он не существует

И не заводи привычку именовать переменные/аргументы одной буквой!

Исходная версия KennyMinigun, :

slist_delete()

- if(l->size > 0) {
+ if(l->free_data && l->size > 0) {

slist_append()

+ if (! l) {
+     l = slist_new();
+     if (! l) return NULL; 
+ }
  snode* n = slist_node_new();
Или более дерзкий вариант:
+ if (! l && !(l = slist_new())) return NULL;
  snode* n = slist_node_new();
... ну и аналогичные рекомендации применимы к аналогичным функциям

Вот так. Потому, что:

  1. не всегда требуется деструктор (например, данные могут быть внешними по отношению к контейнеру)
  2. список — это абстракция, главное — данные, что в нём хранятся. Поэтому добавление существующего элемента в несуществующий список можно считать созданием списка (аналогичное применимо и к удалению последнего элемента, но только если не нужно отличать ситуацию когда список пуст от ситуации, когда он не существует