2016-04-18 9 views
-1

Ich versuche, eine Warteschlange zu erstellen, so dass ich das Array in umgekehrter Reihenfolge gespeichert werden muss, so dass die letzte Eingabe der Kopf des Arrays sein kann, so kann ich Zeug hinzufügen und lösche vorherige Eingaben mit dem Kopf, der zuerst geht (fifo). Ich habe die Funktion head_find gemacht, um den Zeiger bis zum letzten Punkt zu zählen und ihn dann zu löschen und umzuschalten. InhaltWie man den Inhalt des Kopfes des Arrays druckt und es löscht

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

//struct node *head; 
//struct node *size; 
int head; 

void reverse_array(int*, int); 

int main(){ 
int x,i,c,length; 
char collect; 
int rear = -1; 
int front = -1; 
int *size = NULL; 

START:while(1){ 
printf("Enter operation \n"); 
scanf("%c",&collect); 


switch(collect) { 
     case 'C' : 
     printf("create queue\n"); 
       printf("enter size of queue \n"); 
       scanf("%d",&x); 
       if(x <=0){ 
       printf("Numbers Entered must be non Zero postive Numbers \n"); 
       } 
       else 
       printf("Numbers is good \n"); 
       goto START; // leave case 

     break; 
     case 'I' : 
      printf("write vaules\n"); 
      if (front == -1) 
      // int *size =calloc(x,sizeof(int));   //make size of array 
      size = (int*)malloc(sizeof(int)*x);  
        for(i=0;i<x;i++){ 
        scanf("%d",(size+i)); 
       // scanf("%d",&(size[i]));  // scan vaules to address 
        } 
        /* 
        for(i=x-1;d=0;i>=0;i--;d++) 
         int *size2 =calloc(x,sizeof(int)); 
         &(size[d]))=&(size[i]); 
        for (c = 0; c < x; c++) 
         printf("%d\n", &(size[c]); 
        */ 
      break; 
     case 'R' : 
     printf("Read head of queue\n"); 
       /* if (front == - 1) 
     printf("Queue is empty \n"); 
     */ 
      head =head_find(&size); 
      printf("head is %d \n",head); 




     break; 
     case 'P' : 
     printf("print contents=\n"); 

      if (x==0){  // not working as a check 
       printf("queue is empty\n"); 
      } 
      else 
       reverse_array(size,x); 
      for (i = 0 ; i < x ; i++) 
       printf("size[%d]= %d\n", i,*(size+i)); 

       free(size); 



     break; 
     case 'L' : 
     printf("get length of queue\n"); 
      length=point_ln(size); 
      printf("Length is %d \n",length); 

     break; 
     case 'M' : 
     printf("Modify length\n"); 
     break; 
     default: 
     printf("letter must be in caps \n"); 
    } 

} 




return 0; 
} 

int head_find(int *c){ 
    int begin =0; 
while(*c != '\0'){ 
    begin --; 
    c++; 



} 
    return &c; 



} 

int point_ln(int *p){ 
    int start =0; 
while (*p != '\0') { 
     start++; 
     p++; 
    } 
    return start; 

} 


void reverse_array(int *size,int x){ 
    int i,d; 
    int *rev =calloc(x,sizeof(int)); 

    if(rev == NULL) 
     exit(EXIT_FAILURE); 

    for (i = x - 1, d = 0; i >= 0; i--, d++) 
     *(rev+d) = *(size+i); 

    for (i = 0 ; i< x ; i++) 
     *(size+i) = *(rev+i); 

    free(rev); 

} 
+0

Ihr Code definiert zweimal 'reverse_array()'. Kompiliert das? Wenn ja, verwenden Sie keinen C-Compiler. – alk

+0

Bitte den Code richtig einrücken. Wie es steht, ist es (zu?) Schwer zu lesen. – alk

Antwort

0

Ist Ihnen klar, dass size eine lokale Variable innerhalb Ihrer Schleife ist? Der einzige Zeitpunkt der Initialisierung ist case 'I'. Dann verlieren Sie es und beim nächsten Mal in der Schleife haben Sie einen nicht initialisierten Wert für case 'P'.

die Definition außerhalb der Schleife bewegen:

int *size = NULL; 
while(1) { 
    // ... 
} 

Ihr Compiler Sie eine Variable innerhalb einer switch-Anweisung zur Definition gewarnt haben soll. Es kann genau wie Sie zu Verwirrung führen.

Sie haben auch ein Problem mit dem Anruf an reverse_array. Sie übergeben &size[i], wobei i am ehesten x aus einer vorherigen Schleife entspricht. Nur size passieren:

reverse_array(size, x); 

Aber ich sehe nicht, warum Sie das Array, um umkehren müssen sie in umgekehrter Reihenfolge zu drucken. Ich sehe auch nicht, warum Sie das gesamte Array kopieren, um es umzukehren, wenn Sie nur eine Variable zum Tauschen benötigen.

+0

Nun, ich muss den Kopf des Arrays erfassen ich dachte, wenn ich es umkehren werde ich wissen, wo es ist. Ich habe auch diese Funktion repariert. Hast du irgendwelche Ideen, wie man den Kopf des Arrays ohne Verwendung der Linkliste aufnehmen kann? – Codegoblin