embox

Форк
0
/
tree_link.c 
59 строк · 1.2 Кб
1
/**
2
 * @file
3
 * @brief Implementation of methods in util/tree.h
4
 *
5
 * @date Oct 8, 2011
6
 * @author Avdyukhin Dmitry
7
 */
8

9
#include <assert.h>
10
#include <stddef.h>
11

12
#include <lib/libds/dlist.h>
13
#include <lib/libds/tree.h>
14

15
struct tree_link *tree_link_init(struct tree_link *link) {
16
	assert(link != NULL);
17
	dlist_init(&link->children);
18
	dlist_head_init(&link->list_link);
19
	link->par = NULL;
20
	return link;
21
}
22

23
void tree_add_link(struct tree_link *parent, struct tree_link *link) {
24
	assert(parent != NULL);
25
	assert(link != NULL);
26
	assert(link->par == NULL);
27
	dlist_add_prev(&link->list_link, &parent->children);
28
	link->par = parent;
29
}
30

31
void tree_move_link(struct tree_link *parent, struct tree_link *link) {
32
	assert(link != NULL);
33
	assert(parent != NULL);
34
	if (parent != link->par) {
35
		tree_unlink_link(link);
36
		tree_add_link(parent, link);
37
	}
38
}
39

40
int tree_unlink_link(struct tree_link *link) {
41
	assert(link != NULL);
42
	if (link->par != NULL) {
43
		dlist_del_init(&link->list_link);
44
		link->par = NULL;
45
		return 1;
46
	}
47
	return 0;
48
}
49

50
void tree_delete_link(struct tree_link *link,
51
    void dispose(struct tree_link *)) {
52
	struct tree_link *iter;
53
	assert(link != NULL);
54
	tree_unlink_link(link);
55
	tree_postorder_traversal_link_safe(iter, link) {
56
		tree_link_init(iter);
57
		dispose(iter);
58
	}
59
}
60

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.