遍历二进制搜索树,如何避免代码重复

我一直在研究这个小程序。它从文件中读取数据(成员)并将其存储在二进制搜索树中。有两个功能,即打印所有成员和仅打印具有相同船类的所有成员。为此,它遍历了树。

void traverse_tree(member_node member,void(*print_members)(member_node)) {

        print_members(member);

        if (member->left != NULL) {
            traverse_tree(member->left,print_members);
        }

        if (member->right != NULL) {
            traverse_tree(member->right,print_members);
        }
    }

void list_by_boat_class(member_node member,char *boat_class,void(*print_members)(member_node)) {

    if (strcmp(member->boat_class,boat_class) == 0) {
        print_members(member);

    }
    if (member->left != NULL) {
        list_by_boat_class(member->left,boat_class,print_members);
    }
    if (member->right != NULL) {
        list_by_boat_class(member->right,print_members);
    }
}

结构定义:

typedef struct member * member_node;

typedef struct member{
    char name[NAME];
    char personal_names[PERSONAL_NAMES];
    int mem_id;
    char email[EMAIL];
    char boat_class[BOAT_CLASS];
    char boat_name[BOAT_NAME];

    struct member * left;
    struct member * right;
}member;

遍历对我来说似乎是重复的代码。我试图将这些功能合并为一个,但是每个功能采用不同的参数。有什么解决办法还是必须分开?

tickerly 回答:遍历二进制搜索树,如何避免代码重复

将支票移到访客中,并让访客接受传递给traverse_tree的额外参数。

void print_member(member *member,int depth,void *data) {
    ...
}

void print_member_of_boat_class(member *member,void *data) {
    const char *boat_class = data;
    if (strcmp(member->boat_class,boat_class))
        return;

    print_member(member,depth,NULL);
}

void traverse_tree(member *member,void (*visitor)(member*),void *data) {
    visitor(member,data);
    ++depth;
    if (member->left)
        traverse_tree(member->left,print_members,data);
    if (member->right)
        traverse_tree(member->right,data);
}

traverse_tree(tree,print_member,NULL);

traverse_tree(tree,print_member_of_boat_class,boat_class);

将节点的深度传递给访问者通常很有用,因此我也添加了它。

本文链接:https://www.f2er.com/2932823.html

大家都在问