2016-09-09 2 views
2

Folgendes ist meine Warteschlangenimplementierung. Meine Warteschlange ist einfach eine Anordnung von zwei qnodes: Kopf und Rückseite. Enqueue und Dequeue sollen die interne Queue-Implementierung übernehmen.Was ist in dieser Warteschlangenimplementierung falsch?

Die Ausgabe an Q[0].next == Q[1].next kommt 1, nachdem ich Enqueue mit verschiedenen Ganzzahlen aufrufen. Ich kann den Fehler nicht erkennen.

struct Qnode{ 
int index; 
struct Qnode *next; 
}; 
typedef struct Qnode qnode; 

qnode* makeQueue(){ 
    qnode *Q; 
    Q = (qnode *) malloc(2*sizeof(qnode)); 
    qnode head,tail; 
    head.next = NULL; 
    tail.next = NULL; 
    head.index = 0; 
    tail.index = -1; 
    Q[0] = head; 
    Q[1] = tail; 
    return Q; 
} 

void enQueue(qnode *Q, int index){ 
    qnode node,head = Q[0], rear = Q[1]; 
    node.index = index; 
    node.next = NULL; 
    if(head.next == NULL && rear.next == NULL){ 
     head.next = &node; 
     rear.next = &node; 
    } 
    else{ 
     (rear.next)->next = &node; 
     rear.next = &node; 
    } 
    Q[0].index = head.index + 1; 
} 

Dank

+0

'malloc (2 * sizeof (qnode));'? – Groo

+0

als Q selbst wird ein Array von 2 qnodes sein –

+0

Erstens wird es nicht ein * Array * von 2 Knoten, es wird eine * verknüpfte Liste * sein, und Sie brauchen nur den Kopf Knoten auf den ersten Knoten oder zeigen "NULL". Ihre 'Enqueue'-Funktion sollte die Knoten nach Bedarf zuordnen. [Beispiel] (https://gist.github.com/mycodeschool/7510222). – Groo

Antwort

0

Sie haben ein Problem in enQueue Funktion

qnode node,head = Q[0], rear = Q[1]; 
node.index = index; 
node.next = NULL; 
if(head.next == NULL && rear.next == NULL){ 
    head.next = &node; 
    rear.next = &node; 
} 

Das Stück Code oben zu head.next und rear.next die Adresse eines lokalen Bereichs-Variablen zuweist: das heißt zugeordnet Variable stapeln.

node Variable wird nur bis zum Ende der Funktion existieren. Also die Adresse in diese Zeiger sind nicht gültig außerhalb der Funktion: Zugriff darauf außerhalb der Funktion ist illegal und Undefined Behavior

Darüber hinaus sind alle Änderungen in diese Funktion nicht widergespiegelt Q Array: Sie modifizieren lokalen Bereich Kopie von Array-Elementen.

+0

Oh, ich verstehe. Ich habe versucht, Knoten zu einem Qnode * Knoten zu ändern. Das Problem bleibt immer noch –

+0

Sie sollten Ihren gesamten Code neu denken. Dieser Weg ist falsch und nicht das, was du brauchst. Sie müssen (ich denke) eine verkettete Liste implementieren, nicht ein Array von 2 Elementen, die Daten enthalten. – LPs

+0

Ich denke, das zweite Problem war, dass ich Änderungen an Kopf und Rücken vorgenommen habe, die lokale Variablen sind. Der Code funktioniert jetzt. Vielen Dank –