es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿La función de desencolado que trabaja con 2 colas presenta un error de segmentación?

La función debajo debe desencolar una estructura que consta de 2 colas. Cada vez que desencolamos la primera cola, su rear debe convertirse en el front de la segunda cola. Esencialmente, moviendo el primer elemento en la segunda cola a la primera cola para que sea su rear. He ideado el siguiente algoritmo:

“`
int dequeue(queue* Q1,queue* Q2){
node* temp;

if(Q1->rear=NULL){
return 0;
}

if(count<3){
temp=Q1->front;
Q1->front=Q1->front->next;
free(temp);
count–;
return 1;
}

if(count>=3){

temp=Q1->front;
Q1->front=Q1->front->next;
free(temp);

Q1->rear->next=Q2->front;
Q1->rear=Q1->rear->next;
Q2->front=Q2->front->next;
Q1->rear->next=NULL;

if(Q2->front=NULL){
    Q2->rear=NULL;
}

count--;
return 1;

}
}

Da un segfault en Q1->rear->next=Q2->front; ¿Hay alguna otra forma de lograr esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera alternativa de lograr esto. En lugar de asignar Q2->front directamente a Q1->rear->next, podemos crear un nuevo nodo para Q2->front y agregarlo a Q1->rear. Esto se puede hacer utilizando la función enqueue().

    Aquí está la función dequeue() modificada:

    int dequeue(queue* Q1, queue* Q2){
    
        node* temp;
    
        if(Q1->rear==NULL){ // use == instead of =
            return 0;
        }
    
        if(count<3){
            temp=Q1->front;
            Q1->front=Q1->front->next;
            free(temp);
            count--;
            return 1;
        }
    
        if(count>=3){
    
            temp=Q1->front;
            Q1->front=Q1->front->next;
            free(temp);
    
            // create a new node for Q2->front and enqueue it in Q1
            node* new_node = (node*) malloc(sizeof(node));
            new_node->data = Q2->front->data;
            new_node->next = NULL;
            Q1->rear->next = new_node;
            Q1->rear = new_node;
    
            Q2->front=Q2->front->next;
    
            if(Q2->front==NULL){ // use == instead of =
                Q2->rear=NULL;
            }
    
            count--;
            return 1;
        }
    }
    

    En esta función modificada, creamos un nuevo nodo new_node para Q2->front con los mismos datos que Q2->front y luego lo agregamos a Q1 utilizando la función enqueue().

    Tenga en cuenta que también corregí la condición if(Q1->rear=NULL) a if(Q1->rear==NULL) y if(Q2->front=NULL) a if(Q2->front==NULL) que causó el segfault. Esto se debe a que = es el operador de asignación, mientras que == es el operador de comparación.

Comments are closed.