2016-04-18 6 views
-1

私はキューを作成しようとしているので、最後の入力が配列の先頭になるように配列を逆に格納する必要があります。頭が最初に残っている前の入力を削除する(fifo)。私は関数head_findを最後の位置までポインタを数えさせてから、それを削除してシフトさせました。内容アレイの先頭の内容を印刷して削除する方法

#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

あなたのコードは 'reverse_array()'を2回定義しています。これはコンパイルされますか?はいの場合は、Cコンパイラを使用していません。 – alk

+0

また、コードを正しくインデントしてください。それが立っているので、読むのも難しいですか? – alk

答えて

0

sizeはループ内のローカル変数ですか?それが初期化される唯一の時間はcase 'I'です。次にそれをリークし、ループの次回にはcase 'P'の初期化されていない値があります。あなたのコンパイラは、switchステートメント内の変数の定義について警告している必要があり

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

は、あなたのループの定義 外を移動し

。あなたが経験しているのとまったく同じように混乱を招く可能性があります。

また、reverse_arrayへの電話に問題があります。 &size[i]を渡しています。ここで、iは、前のループからの可能性が最も高いのはxです。ただ、sizeを渡す:

reverse_array(size, x); 

あなたは逆にそれを印刷するために、配列を逆にする必要がある理由しかし、私は表示されません。また、配列全体をコピーして逆にする理由がわかりません。必要なのは、スワップするための変数です。

+0

よく私は配列の頭をキャプチャする必要があります私はそれが逆であれば私はそれがどこにあるのか分かります。私もその機能を修正しました。あなたはどのようにリンクリストを使用せずに配列の頭をキャプチャするためのアイデアを持っていますか? – Codegoblin

関連する問題