2016-05-01 4 views
-3

Ich bin sehr neu in der Programmierung. Ich wollte ein Programm schreiben, um eine Warteschlange mit einem Array (zirkuläre Warteschlange) zu implementieren. Ich denke, das Einfügen von & Löschen von Element aus der Warteschlange Funktionen sind korrekt, aber es gibt ein Problem in der Anzeigefunktion. Wenn die Warteschlange voll ist, wenn ich versuche, mehr Elemente einzufügen, zeigt es nicht "QUEUE FULL" wie pro Funktion, es zeigt einige Abfallwerte neben Elementen.Wo ist der Fehler in diesem C-Code?

#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 

#define m 3 // maximum size of array 
int Q[m]; 
int f=-1,r=-1,s;  //f=front,r=rear,s=rear in another term for finding wheather is 

queue full 


int enQueue(int item){ 
    s = (r+1)%(m+1); 
    if(f == s) 
     printf("\nQUEUE FULL"); 
    else{ 
     Q[s] = item; 
     r = s; 
    } 

return 0; 
} 


int deQueue(){ 
    int item; 
    if(f == r) 
     printf("\nQUEUE UNDERFLOW"); 
    else{ 
     f = (f+1)%(m+1); 
     item = Q[f]; 
     Q[f] = NULL; 
    } 

return 0; 
} 

void displayQueue(){ 
    int i; 
    if(f == r) 
     printf(" \n The queue is empty\n"); 
    else { 
     printf("\nQUEUE IS : \n"); 
     for(i=f+1; i<=s; i++) { 
      printf("%d\t", Q[i]); 
     } 
     printf("\n\n********************************************"); 
    } 

} 



int main(){ 
    int item,i,j; 

    while (1){ 
     printf("\n\nENTER ITEM TO INSERT : "); 
     scanf("%d", &item); 

     enQueue(item); 
     displayQueue(); 
    } 

_getch(); 
return 0; 
} 
+3

Haben Sie einen Debugger verwendet? – MikeCAT

+3

Warum wird 'm + 1' anstelle von' m' verwendet, um die Zahl zu teilen? Es besteht die Gefahr, dass das Array außerhalb des Bereichs liegt! – MikeCAT

+0

Ich schrieb diesen Code in Visual Studio 12 @ MikeCAT – Fsalad

Antwort

1

Der Code schon einige Probleme bereiten verfolgen hat. Diese Antwort befasst sich nur mit dem, was sich im Bereich der Frage befindet. Ich hoffe, es kann helfen.

int enQueue(int item){ 
    if(r+1 >= m) //check against queue size first... 
     printf("\nQUEUE FULL"); 
    else{ 
     s = (r+1)%(m); 
     Q[s] = item; 
     r = s; 
    } 
return 0;  //the return value part could be written better... 
} 
+0

Jetzt funktioniert es gut – Fsalad

1

Das Problem ist in dem if Zustand in der enQueue() Funktion.

f ist -1, die keine Änderung im gesamten Programm erhält, und s wird nie -1 sein, also wird die Bedingung nie funktionieren.

Ändern Sie die if-Bedingung von s == f zu s==m, das heißt.

if(s == m) 
    printf("Queue is full"); 

Führen Sie das Programm erneut aus. Ich habe es getestet.

1

können Sie eine neue Zählvariable versuchen, so dass Sie die Anzahl der Elemente in dem Array eine Zeit

initialize the count to 0 as global 
if enque 
check count for the overflow 
if not 
    add element and increase the count 
if deque 
check count for the underflow 
if not 
    delete the element and decrese the count