реализация очереди в структурированном подходе - PullRequest
0 голосов
/ 06 октября 2018

Что касается моего структурированного подхода к созданию программы очередей, у меня есть несколько проблем с синтаксисом и индексами массивов, когда дело доходит до указателей.Я отметил линии, в которых у меня возникли проблемы.Это все из-за неправильного приведения или проблем с неправильным синтаксисом?

    bool Enqueque(int** queue, int* front, int* rear, int* nElements, int* capacity, 
                  int userInput)
    {   

        //if there is no more space in the Queue
        if( *nElements == *capacity )
        {
            //update the capacity
            *capacity = *nElements * 2;

            //asked OS for more memory
            int* growQueue = (int*)malloc( (*capacity) * sizeof(int) );

            //error checking
            if(growQueue == NULL)
                return false;

            //take all the elements from the original queue and put into the bigger queue  
            for(int i = 0; i<*nElements; i++)
                growQueue[i] = (*queue)[i];
            free(*queue);
            *queue = growQueue;

            (*queue)[*nElements] = userInput;
            nElements++;

        }

        //if there is space in the queue
        else if(*nElements+1 > *capacity)
        {
            //if queue is empty
             if(front == NULL)
            {
                //front and rear are both pointers to the same element

                //These two lines are giving warnings
                //QueueLibrary.c:42:19: warning: assignment makes pointer from //integer without a cast [-Wint-conversion]
  //           front = (*queue)[0];
                   ^
//QueueLibrary.c:43:18: warning: assignment makes pointer from integer without a //cast [-Wint-conversion]
             //rear = (*queue)[0];
                front = (*queue)[0];
                rear = (*queue)[0];



                (*queue)[0] = userInput;
                *nElements++;
                return true;
            }

             else if(*nElements >= 1)
             {
                 //move the userInput into the next available spot behind the 
                 //element after rear. 


//QueueLibrary.c:54:24: warning: cast from pointer to integer of different size //[-Wpointer-to-int-cast]

              (*queue)[ (int)rear+1 ] = userInput;
                 (*queue)[ rear+1 ] = userInput;


//Array subscript is not an integer
                 rear = (*queue)[ rear+1 ];
                 return true;
             }
        }    
    }

1 Ответ

0 голосов
/ 06 октября 2018

Вы должны помнить, что индексирование массива с помощью array[index] эквивалентно операции *(array + index).Итак, давайте рассмотрим, что вы в данный момент делаете и почему это неправильно.

У вас есть переменная int **queue, которая является указателем на указатель на int.И вы хотите извлечь фронт и поместить его в переменную int *front.Ваш текущий подход:

int *front = (*queue)[0];

и переведенный с использованием эквивалента сверху дает:

int *front = *((*queue) + 0)

, первый (*queue) разыменовывает queue и дает int *.Затем вы добавляете 0 к int *, который дает тот же самый, и затем вы разыменовываете это.И что дает разыменование int *?

Подсказка : вам не следует назначать int *foo для int bar напрямую с foo = bar.

Переходя к другим проблемам, подписчикам массива необходимобыть целыми числами.Анализ типа int * rear должен прояснить, почему array[rear] выдает предупреждение.

Если int *rear должен указывать на заднюю часть очереди, почемуне просто использовать его в качестве указателя вместо того, чтобы пытаться индексировать очередь с ним?:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...