在树中查找函数
Find function in a tree
我有一个函数有问题,该函数应该找到树中具有相同名称的所有节点,我必须保存找到的每个节点的路径。
我已经使用基于深度优先搜索的算法实现了我的功能,但问题是保存的路径不完整。例如,节点在路径 /dir0rid/dir0rid/dir1rid/file1
中,函数只保存路径 /dir1rid/file1
.
这是我的功能:
void find(node_t *Fs) {
int i = 0;
while (i < 1024) {
if (Fs->figli[i] != NULL) {
if (Fs->figli[i]->nome_file == NULL) {
i++;
} else {
if (strcmp(Fs->figli[i]->nome_file, "DELETED") != 0) {
if (Fs->figli[i]->type == 1) {
i++;
} else {
finded[j_index] = Fs->figli[i];
j_index++;
find(Fs->figli[i]);
i++;
j_index--;
finded[j_index] = NULL;
}
} else {
i++;
}
}
} else {
i++;
}
}
if (hash_search(Fs, file_cercato) != NULL) {
int j = 0;
percorso[f_index][0] = '[=10=]';
while (finded[j] != NULL) {
strcat(percorso[f_index], "/");
strcat(percorso[f_index], finded[j]->nome_file);
j++;
}
strcat(percorso[f_index], "/");
strcat(percorso[f_index], file_cercato);
f_index++;
percorso[f_index][0] = '[=10=]';
}
return;
}
循环的简化版本(我省略了hashstuff):
void find2 (node_t* Fs){
int i ;
for(i=0; i < 1024; i++){
if (Fs->figli[i] == NULL) continue;
if(Fs->figli[i]->nome_file == NULL) continue;
if(!strcmp(Fs->figli[i]->nome_file,"DELETED")) continue;
if(Fs->figli[i]->type==1) continue;
finded[j_index]=Fs->figli[i];
j_index++;
find(Fs->figli[i]);
j_index--; // <<--
finded[j_index]=NULL; // <<--
}
}
现在,我不明白你的逻辑,但我认为 j_index--;
是错误的。它应该可能放在之后 finded[j_index]=NULL;
您的代码中存在一些问题:
- 您应该使用
for
循环来简化索引更新并使代码更具可读性。
- 在递归调用
find
之前,您应该将finded[j_index]
设置为NULL
,或者将最终循环更改为在j_index
处停止。
这是修改后的版本:
void find(node_t *Fs) {
for (int i = 0; i < 1024; i++) {
if (Fs->figli[i] != NULL
&& Fs->figli[i]->type != 1
&& Fs->figli[i]->nome_file != NULL
&& strcmp(Fs->figli[i]->nome_file, "DELETED") != 0) {
finded[j_index] = Fs->figli[i];
j_index++;
find(Fs->figli[i]);
j_index--;
}
}
if (hash_search(Fs, file_cercato) != NULL) {
percorso[f_index][0] = '[=10=]';
for (j = 0; j < j_index; j++) {
strcat(percorso[f_index], "/");
strcat(percorso[f_index], finded[j]->nome_file);
}
strcat(percorso[f_index], "/");
strcat(percorso[f_index], file_cercato);
f_index++;
percorso[f_index][0] = '[=10=]';
}
}
另请注意,所有这些使用的全局变量都应移动到作为参数传递给 find()
的结构中。
我有一个函数有问题,该函数应该找到树中具有相同名称的所有节点,我必须保存找到的每个节点的路径。
我已经使用基于深度优先搜索的算法实现了我的功能,但问题是保存的路径不完整。例如,节点在路径 /dir0rid/dir0rid/dir1rid/file1
中,函数只保存路径 /dir1rid/file1
.
这是我的功能:
void find(node_t *Fs) {
int i = 0;
while (i < 1024) {
if (Fs->figli[i] != NULL) {
if (Fs->figli[i]->nome_file == NULL) {
i++;
} else {
if (strcmp(Fs->figli[i]->nome_file, "DELETED") != 0) {
if (Fs->figli[i]->type == 1) {
i++;
} else {
finded[j_index] = Fs->figli[i];
j_index++;
find(Fs->figli[i]);
i++;
j_index--;
finded[j_index] = NULL;
}
} else {
i++;
}
}
} else {
i++;
}
}
if (hash_search(Fs, file_cercato) != NULL) {
int j = 0;
percorso[f_index][0] = '[=10=]';
while (finded[j] != NULL) {
strcat(percorso[f_index], "/");
strcat(percorso[f_index], finded[j]->nome_file);
j++;
}
strcat(percorso[f_index], "/");
strcat(percorso[f_index], file_cercato);
f_index++;
percorso[f_index][0] = '[=10=]';
}
return;
}
循环的简化版本(我省略了hashstuff):
void find2 (node_t* Fs){
int i ;
for(i=0; i < 1024; i++){
if (Fs->figli[i] == NULL) continue;
if(Fs->figli[i]->nome_file == NULL) continue;
if(!strcmp(Fs->figli[i]->nome_file,"DELETED")) continue;
if(Fs->figli[i]->type==1) continue;
finded[j_index]=Fs->figli[i];
j_index++;
find(Fs->figli[i]);
j_index--; // <<--
finded[j_index]=NULL; // <<--
}
}
现在,我不明白你的逻辑,但我认为 j_index--;
是错误的。它应该可能放在之后 finded[j_index]=NULL;
您的代码中存在一些问题:
- 您应该使用
for
循环来简化索引更新并使代码更具可读性。 - 在递归调用
find
之前,您应该将finded[j_index]
设置为NULL
,或者将最终循环更改为在j_index
处停止。
这是修改后的版本:
void find(node_t *Fs) {
for (int i = 0; i < 1024; i++) {
if (Fs->figli[i] != NULL
&& Fs->figli[i]->type != 1
&& Fs->figli[i]->nome_file != NULL
&& strcmp(Fs->figli[i]->nome_file, "DELETED") != 0) {
finded[j_index] = Fs->figli[i];
j_index++;
find(Fs->figli[i]);
j_index--;
}
}
if (hash_search(Fs, file_cercato) != NULL) {
percorso[f_index][0] = '[=10=]';
for (j = 0; j < j_index; j++) {
strcat(percorso[f_index], "/");
strcat(percorso[f_index], finded[j]->nome_file);
}
strcat(percorso[f_index], "/");
strcat(percorso[f_index], file_cercato);
f_index++;
percorso[f_index][0] = '[=10=]';
}
}
另请注意,所有这些使用的全局变量都应移动到作为参数传递给 find()
的结构中。