2015-03-20 2 views
0

Проблема заключается в том, что когда я вызываю функцию initDeque для создания функции deque, функция должна проверить, была ли инициализирована deque. Моя мысль имела переменную bool isInit в структуре deque и проверяла, действительно ли isInit истинно (инициировано)/false (не инициировано). Но проблема в том, что если я звоню initDeque более одного раза, он снова инициирует deque. Вот код:Проверьте, был ли связанный список инициализирован

int initDeque(deque *d){ //Create new deque 
    d = (deque*)malloc(sizeof(deque)); 
    if ((d->isInit)==false){ 

     if (!d) { 
      perror("malloc"); 
      exit(EXIT_FAILURE); 
     } 
     d->isInit=true; 
     d->front=NULL; 
     d->rear=NULL; 
     return d; 
    } else { 
     printf("Deque is already initialized!"); 
    } 
} 

и структура:

typedef struct{ 
    link front; 
    link rear; 
    bool isInit; 
}deque; 

Моя мысль в том, что, когда я выделить память в первую очередь, он удаляет все данные, хранящиеся в front; rear; isInit;. Что мне делать?

+0

Просто потому, что вы выделить пространство для структуры, не означает, что она установлена. Вы должны сначала установить значения в своей структуре «d». Кроме того, что-то кажется подозрительным в вызове! Вы исходите из фона PHP? Edit * О, я вижу, да, когда вы снова вызываете malloc, вы создаете новый указатель, поэтому ссылки на старый d теряются в рамках этой функции. – EyeOfTheHawks

+0

Инструкция 'd = (deque *) malloc (sizeof (deque));' перезаписывает предыдущий контент d указателем на неинициализированный буфер. Затем вы проверяете 'd-> isInit'! Как это может работать? Возвращение также является фиктивным. – chmike

+0

Я имею в виду, когда я снова вызываю функцию, и она выделяет память для 'd', не уничтожает ли она все данные и не устанавливает их в' NULL' и 'false'? И нет, C - мой первый язык. –

ответ

1

Вы могли бы попробовать что-то вроде этого:

deque* initDeque(deque *d){ //Create new deque 
    if(d == NULL){ 
     d = (deque*)malloc(sizeof(deque)); 
     d->isInit = false; 
    } 
    if ((d->isInit)==false){ 
     if (!d) { 
      perror("malloc"); 
      exit(EXIT_FAILURE); 
     } 
     d->isInit=true; 
     d->front=NULL; 
     d->rear=NULL; 
    } else 
     printf("Deque is already initialized!"); 
    return d; 
} 

Как уже упоминалось во многих местах на этом посту, это странно реализация.

Обычно с такой структурой данных вы должны иметь функции create(), destroy (deque * d), queue (deque * d), dequeue (deque * d).

В верхней части каждой функции вы бы чек NULL (кроме создания)

+0

Вы должны переместить блок 'if (! D)' сразу после malloc. – chmike

+0

не работает, это приводит к ошибке в 'if ((d-> isInit) == false) {}' –

+0

@ RimantasRadžiūnas Что вы передаете как параметр? Кроме того, какая ошибка? – EyeOfTheHawks

1

Вы должны инициализировать Deque при ее создании. Нет необходимости повторно инициализировать его.

deque * newDeque(){ //Create new deque 
    deque* d = malloc(sizeof(deque)); 
    if (!d) { 
     perror("malloc"); 
     exit(EXIT_FAILURE); 
    } 

    d->isInit=true; // not needed anymore 
    d->front=NULL; 
    d->rear=NULL; 
    return d; 
} 

В случае, если вы действительно хотите, чтобы ваше initDeque функции, здесь предлагаются реализация

deque * initDeque(deque * d){ //Create new deque if needed 
    if (d == NULL) { 
     deque* d = malloc(sizeof(deque)); 
     if (!d) { 
      perror("malloc"); 
      exit(EXIT_FAILURE); 
     } 
     d->front=NULL; 
     d->rear=NULL; 
    } 
    return d; 
} 
Смежные вопросы