我有以下任务:从字符串创建一个二进制搜索树,然后按字母顺序打印它们。 例如,
orange
melon
apple
grapes
plum
banana
应该有
apple
banana
grapes
melon
orange
plum
作为输出。我写了一个解决方案,但是我有一个问题:仅打印输入中的最后一个字符串(在本示例中为banana
),并且在代码中找不到错误。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char *data;
struct Node *left;
struct Node *right;
} Node;
Node* getFreeNode(char *value) {
Node* tmp = (Node*)malloc(sizeof(Node));
tmp->left = tmp->right = NULL;
tmp->data = value;
return tmp;
}
void insert(Node **head, char *value) {
Node* tmp = (Node*)malloc(sizeof(Node));
tmp = *head;
if (*head == NULL) {
*head = getFreeNode(value);
return;
}
else{
if (strcmp(value, tmp->data) > 0) {
return insert(&(tmp->right), value);
}
else if (strcmp(value, tmp->data) < 0) {
return insert(&(tmp->left), value);
}
}
}
void print_tree(Node *t)
{
if (!t) return;
print_tree(t->left);
printf("%s\n", t->data);
print_tree(t->right);
}
int main(){
Node* a = NULL;
FILE *in = fopen("input.txt", "r");
freopen("output.txt", "w", stdout);
char word[20];
while (fscanf(in, "%s", word) == 1){
insert(&a, word);
}
print_tree(a);
return 0;
}
答案 0 :(得分:1)
在exports.handler = async (event, context, callback) => {
console.log("Starting call: " + event.queryStringParameters.filter);
console.log("Decoded param: " + decodeURIComponent(event.queryStringParameters.filter));
var filter = JSON.parse(decodeURIComponent(event.queryStringParameters.filter));
console.log("Filter: " + filter);
var ingredients = filter.ingredients;
var options = {
uri: 'https://api.*****.com/search',
qs: {
app_id: '****',
app_key: '*****',
q: ingredients.join(' ')
},
json: true
};
console.log("Done calling stuff");
rp(options)
.then(function(recipes) {
console.log('Response: ' + recipes);
var recipesToReturn = [];
recipes.hits.forEach(function(recipeHit) {
recipesToReturn.push(objectMapper(recipeHit.recipe, recipeMap));
});
console.log('Recipes:', recipesToReturn);
const response = {
statusCode: 200,
body: JSON.stringify(recipesToReturn),
};
return JSON.stringify(response);
})
.catch(function(err) {
console.log('Error:', err)
const response = {
statusCode: 400,
body: err,
};
return JSON.stringify(response);
});
};
中,您的代码正在插入main
,这是一个本地堆栈变量。因此,每个节点的word
成员都指向相同的地址。将data
的内存地址插入树后,用文件的下一行覆盖word
。同样,最终结果是,ever节点的word
成员指向同一字符串-读入的最后一个字符串。
在将字符串插入树中之前,需要对其进行复制。修改您的getFreeNode函数,如下所示:
data
strdup复制该字符串。您可以通过在源文件顶部包括Node* getFreeNode(char *value) {
Node* tmp = (Node*)malloc(sizeof(Node));
tmp->left = tmp->right = NULL;
// tmp->data = value;
tmp->data = strdup(value); // make a copy of the string for the new node
return tmp;
}
来使用它。否则,它与此相同:
#include <strings.h>
正如原始问题的评论部分所暗示的那样,这可能不是您唯一的错误。