Practice 4 intrusive list — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
(Новая страница: «== Дедлайн == Среда (8.10.2014) 23.59 UTC+4. == Как сдавать == Написать письмо на адрес alexander.opeykin@gmail.com c т…»)
 
(clist.cpp)
 
Строка 36: Строка 36:
  
 
==== clist.cpp ====  
 
==== clist.cpp ====  
  init_list(intrusive_list, intrusive_node)
+
  init_list(intrusive_list)
 
  add_node(intrusive_list, intrusive_node)
 
  add_node(intrusive_list, intrusive_node)
 
  remove_node(intrusive_list, intrusive_node)
 
  remove_node(intrusive_list, intrusive_node)

Текущая версия на 11:15, 11 октября 2014

Дедлайн

Среда (8.10.2014) 23.59 UTC+4.

Как сдавать

Написать письмо на адрес alexander.opeykin@gmail.com c темой 'Практика 4'.

К письму приложить архив директории. Назвать по аналогии с alexander.opeykin.tgz

Важно

Текст задачи немного изменен для унификации со второй группой!

Стуктура

Makefile, main.cpp (тесты для списка с position), clist.cpp, clist.h.

Постановка задачи

Реализовать переиспользуемые интрузивные списки в стиле C.

Структуры

struct intrusive_node {
  struct intrusive_node *next;
  struct intrusice_node *prev;
};
struct intrusive_list {
  struct intrusive_node head;
};
struct position_node {
  int x;
  int y;
  struct intrusive_node node;
};

Функции, которые нужно реализовать

Указатели надо расставить самостоятельно!

clist.cpp

init_list(intrusive_list)
add_node(intrusive_list, intrusive_node)
remove_node(intrusive_list, intrusive_node)
int get_length(intrusive_list)

main.сpp

remove_position(intrusive_list, x, y) // удаляет все вхождения x,y
add_positon(intrusive_list, int x, int y) 
show_all_positions()
remove_all()

Базовый тест

Для короектной работы самостоятельно расставьте символы * и &

int main() {
  intrusive_list_t l;
  init_list(l);
  add_positon(l, 10, 10);
  add_positon(l, 20, 20);    
  show_all_positions(l);
  return 0;
}

Подсказка

#define container_of(ptr, type, member) (type*)((char*)(ptr) - offsetof(type, member))