You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改二叉树中字符串(IP地址)的值?附代码问题求助

解决二叉树节点IP更新的问题

看起来你现在卡在两个点上:根节点的IP改不动,还没实现整树遍历的逻辑。咱们一步步拆解解决:

先解决根节点无法更新的核心问题

最常见的原因是参数传递方式错了——如果你的update函数里传的是RACUNAR root(值传递),那你修改的只是根节点的副本,原树里的根节点根本不会变。必须传指针RACUNAR *root,这样才能直接操作原节点的内存。

另外还要检查这两个细节:

  • 如果你的red_br是字符串类型,别用==比较!C语言里==比的是字符串的内存地址,不是内容,得用strcmp(node->red_br, s_red_br) == 0来判断匹配。
  • 给ip_adresa赋值时,别直接用=,要用strncpy(记得留位置加结束符\0),避免字符串越界。

实现整树遍历的逻辑

二叉树找节点用递归遍历最直接,前序、中序、后序都行,这里用前序遍历(先检查当前节点,再递归左、右子树)的例子:

先假设你的结构体定义是这样的(如果和你的实际代码有出入,调整对应字段就行):

typedef struct racunar {
    int red_br;          // PC编号
    char ip_adresa[20];  // IP地址
    struct racunar *left;
    struct racunar *right;
} RACUNAR;

然后写两个函数:一个负责遍历更新节点,一个负责从upd文件读数据:

// 递归遍历二叉树,找到匹配节点并更新IP
void updateNode(RACUNAR *node, int target_red_br, const char *new_ip) {
    if (node == NULL) return; // 空节点直接返回

    // 检查当前节点是否匹配
    if (node->red_br == target_red_br) {
        // 安全复制新IP,避免越界
        strncpy(node->ip_adresa, new_ip, sizeof(node->ip_adresa) - 1);
        node->ip_adresa[sizeof(node->ip_adresa) - 1] = '\0';
        printf("已更新编号%d的IP为:%s\n", target_red_br, new_ip);
        return; // 如果每个red_br唯一,找到后可以提前退出
    }

    // 递归遍历左、右子树
    updateNode(node->left, target_red_br, new_ip);
    updateNode(node->right, target_red_br, new_ip);
}

// 从upd文件读取更新指令,调用遍历函数
void updateFromFile(RACUNAR *root, const char *filename) {
    FILE *file = fopen(filename, "r");
    if (!file) {
        perror("打开upd文件失败");
        return;
    }

    int s_red_br;
    char s_ip_adresa[20];
    // 按「编号 IP」的格式读取每行数据
    while (fscanf(file, "%d %s", &s_red_br, s_ip_adresa) == 2) {
        updateNode(root, s_red_br, s_ip_adresa);
    }

    fclose(file);
}

调用示例

在主函数里你可以这么用:

int main() {
    // 假设你已经创建了二叉树,root指向根节点
    RACUNAR *root = createRootNode(1, "192.168.1.10"); // 示例创建根节点
    // 调用更新函数
    updateFromFile(root, "upd");
    // ... 后续操作
    return 0;
}

额外提醒

  • 如果你的red_br是字符串类型,把target_red_br改成char*,比较时用strcmp(node->red_br, target_red_br) == 0。
  • 确认upd文件的格式正确,每行是「PC编号 新IP」,比如:
    1 192.168.1.20
    3 10.0.0.5
    
  • 测试时先打印根节点的原始IP,再调用更新函数,之后再打印一次,确认是否修改成功。

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:35:50