如何从char类型数据中仅提取Int值以构建二叉搜索树
修复方案与代码实现
现有代码核心问题
- 结构体定义不符合需求:
password字段为单个char类型,无法存储字符序列,需改为char数组存储字符串 add函数逻辑错误:当前判断malloc返回NULL时才给节点赋值,逻辑完全颠倒,且未实现二叉搜索树的插入规则、未维护根节点- 读取逻辑未做字段拆分:当前仅逐字符打印文件内容,没有按照「数字+空格+字符序列」的格式提取对应字段
- 缺少边界校验:未判断文件打开是否成功、读取内容是否合法
完整实现代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 假设字符序列最长为63字节,可根据实际需求调整 #define MAX_PWD_LEN 64 typedef struct treenode{ struct treenode *lchild, *rchild; int id; char password[MAX_PWD_LEN]; // 存储字符序列作为key } node; // 维护BST根节点 static node *root = NULL; // BST插入逻辑,以password为key排序 node* add(node *cur, int id, const char* password) { if (cur == NULL) { node *new_node = (node*)malloc(sizeof(node)); if (new_node == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } new_node->lchild = new_node->rchild = NULL; new_node->id = id; strncpy(new_node->password, password, MAX_PWD_LEN - 1); new_node->password[MAX_PWD_LEN - 1] = '\0'; // 确保字符串结尾 return new_node; } int cmp_res = strcmp(password, cur->password); if (cmp_res < 0) { cur->lchild = add(cur->lchild, id, password); } else if (cmp_res > 0) { cur->rchild = add(cur->rchild, id, password); } else { // key重复的处理逻辑,可根据需求修改,这里默认覆盖id cur->id = id; } return cur; } int main(void) { FILE *fp = fopen("data.txt", "r"); if (fp == NULL) { perror("fopen data.txt failed"); return EXIT_FAILURE; } int id; char pwd_buf[MAX_PWD_LEN]; // 逐行匹配数字+空格+字符序列格式,fscanf自动跳过空格、换行 while (fscanf(fp, "%d %s", &id, pwd_buf) == 2) { root = add(root, id, pwd_buf); } fclose(fp); // 后续可自行添加BST的遍历、查询等逻辑 printf("数据导入完成\n"); return EXIT_SUCCESS; }
关键逻辑说明
- 字段提取直接使用
fscanf格式化匹配,无需手动拆分逐字符读取的内容,处理15万行级别的数据效率足够,且实现简单 - BST插入以字符序列为key,使用
strcmp对比字符串大小实现排序规则 - 增加了内存分配、文件打开、数据读取的错误校验,避免异常崩溃
内容的提问来源于stack exchange,提问作者Stifff
相关产品推荐
相关产品推荐

