如何修改二叉树中字符串(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
相关产品推荐
相关产品推荐

