2016-06-18 19 views
1

Ich habe eine Struktur, die Zeiger next enthält. Ich versuche, eine Warteschlange der Strukturen zu machen, aber wenn ich enqueue/dequeue rufe, bekomme ich schließlich Fehler, die versuchen, Informationen zu schreiben; und weiß nicht, ob es wegen enque/dequeue/insert ist. Nur lernen C und nicht wirklich sicher free/malloc oder wenn sie notwendig sind. Die Einfügung basiert auf dem int-Wert (kleinster Wert zuerst).Enqueue/Dequeue/Struktur in eine Warteschlange einfügen

struct queue { 
    struct RCB* front; 
    struct RCB* back; 
}; 

/*Initialize queue */ 
struct queue* new_queue(void){ 
    struct queue* tmp = malloc(1 * sizeof(tmp)); 
    tmp->front = NULL; 
    tmp->back = NULL; 
    return tmp; 
} 

/*Add RCB to Queue FIFO */ 
struct queue* enqueue(struct queue* queue, struct RCB* rcb){ 
    if(queue->front == NULL && queue->back == NULL){ 
     queue->front = rcb; 
     queue->back = rcb; 
      printf("added front to queue\n"); 
     return queue; 
    } 
    else { 
     queue->back->next = rcb; 
     queue->back = rcb; 
      printf("added to queue\n"); 
    } 
    return queue; 
} 

/*Remove RCB from Queue FIFO */ 
struct RCB* dequeue(struct queue* queue){ 
    struct RCB *tmp1 = (struct RCB *)malloc(sizeof(struct RCB)); 
    struct RCB *tmp2 = (struct RCB *)malloc(sizeof(struct RCB)); 
    if(queue->front == NULL && queue->back == NULL){ 
     printf("queue is empty\n"); 
    } 
    tmp1 = queue->front; 
    tmp2 = tmp1->next; 
    queue->front = tmp2; 
    if(queue->front == NULL){ 
     queue->back = queue->front; 
      printf("removed rcb from queue\n"); 
    } 
    return tmp1; 
} 
/*Insert RCB into Queue */ 
struct queue* insert(struct queue* queue, struct RCB* rcb){ 
      if(queue->front == NULL && queue->back == NULL){ 
       queue->front = rcb; 
       queue->back = rcb; 
       return queue; 
      } 
      if(queue->front->next == NULL){ 
       queue->front->next = rcb; 
       return queue; 
      } 

      struct RCB *tmp = (struct RCB *)malloc(sizeof(struct RCB)); 
        tmp = queue->front; 
         while(tmp->next->b2r < rcb->b2r || tmp->next == NULL){ 
         tmp = tmp->next; 
        } 
        rcb->next = tmp->next; 
        tmp->next = rcb; 

        return queue; 
    } 

Jede Hilfe wird sehr geschätzt.

+3

'sizeof (tmp)' ist falsch, es ist die Größe des * Zeiger * und nicht das, was er zeigt. Sie sollten stattdessen 'sizeof (* tmp)' verwenden. –

+0

danke!, Immer noch über Zeiger lernen –

+0

Die beiden 'malloc' in' dequeue' sind durchgesickert, entfernen sie, siehe meine Antwort. – fluter

Antwort

3
  1. Do not cast malloc return value

  2. in new_queue, struct queue* tmp = malloc(1 * sizeof(tmp)); falsch ist, da dies einen Puffer mit einer Größe von Zeigern auf struct queue anstelle der Größe von struct queue zuteilen, auch die 1*foo Sache ist überhaupt nicht sinnvoll. Verwenden Sie die folgenden:

    struct queue* tmp = malloc(sizeof(*tmp)); 
    
  3. in dequeue, Sie zwei Puffer von struct RCB sind Zuteilung während imediately die Referenz durch assign tmp1 and tmp1 den Zeiger auf sie verlieren, sind diejenigen, die nicht erforderlich, und Sie erstellen Speicherlecks. Was Sie brauchen, sind nur zwei Zeiger:

    struct RCB* dequeue(struct queue* queue) { 
         struct RCB *tmp1; 
         struct RCB *tmp2; 
         if(queue->front == NULL && queue->back == NULL) { 
          printf("queue is empty\n"); 
         } 
         tmp1 = queue->front; 
         tmp2 = tmp1->next; 
         queue->front = tmp2; 
         if(queue->front == NULL) { 
          queue->back = queue->front; 
           printf("removed rcb from queue\n"); 
         } 
         return tmp1; 
    } 
    
Verwandte Themen