我使用递归函数,但我正在初始化一个存储函数内值的队列。我希望每次使用递归时都避免初始化队列,因为那时我丢失了需要存储的值。不幸的是,我给出的代码的结构是这样的,我无法修改函数定义。
void function(Graph* graph, int edge_id) {
Queue * queue = new_queue();
Edge* temp = graph->vertices[edge_id]->first_edge;
while(temp!=NULL){
queue_enqueue(queue, temp->v);
temp=temp->next_edge;
}
queue_print(queue);
if(temp == NULL){
function(graph, queue->elements->head->data);
}
答案 0 :(得分:4)
只需创建另一个函数并将其调用为函数:)
由于这个'技巧',你不会改变名为function
void function_b(Graphe *graph, int edge_id, Queue *queue) {
Edge* temp = graph->vertices[edge_id]->first_edge;
while(temp!=NULL){
queue_enqueue(queue, temp->v);
temp=temp->next_edge;
}
queue_print(queue);
if(temp == NULL){
function_b(graph, queue->elements->head->data, queue);
}
}
void function(Graph* graph, int edge_id) {
Queue * queue = new_queue();
function_b(graph, edge_id, queue);
}
答案 1 :(得分:1)
您需要使您的队列保持静态,这样它将在您对函数的多次调用中生存,并且只能初始化一次。这里有很多关于静态的问题和答案。
void function(Graph* graph, int edge_id) {
static Queue * queue = NULL;
if (queue == NULL) {
queue = new_queue();
}
Edge* temp = graph->vertices[edge_id]->first_edge;
while(temp!=NULL){
queue_enqueue(queue, temp->v);
temp=temp->next_edge;
}
queue_print(queue);
if(temp == NULL){
function(graph, queue->elements->head->data);
}
}