2017-02-19 5 views
0

Я пытался реализовать граф, используя список смежности. Когда инициализация главы как NULL в цикле for в методе CreateGraph, голова реферируется с использованием. вместо '->'. Я не понимаю разницы. Когда мы должны использовать '.' и когда «->». И почему это дает ошибку, когда я использую -> оператор для головы.Когда использовать. и -> в случае указателей

struct AdjListNode 
{ 
int dest; 
struct AdjListNode* next; 
}; 


struct AdjList 
{ 
struct AdjListNode *head; // pointer to head node of list 
}; 


struct Graph 
{ 
int V; 
struct AdjList* array; 
}; 

// A utility function to create a new adjacency list node 
struct AdjListNode* newAdjListNode(int dest) 
{ 
struct AdjListNode* newNode = 
     (struct AdjListNode*) malloc(sizeof(struct AdjListNode)); 
newNode->dest = dest; 
newNode->next = NULL; 
return newNode; 
} 

// A utility function that creates a graph of V vertices 
struct Graph* createGraph(int V) 
{ 
struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph)); 
graph->V = V; 

// Create an array of adjacency lists. Size of array will be V 
graph->array = (struct AdjList*) malloc(V * sizeof(struct AdjList)); 

// Initialize each adjacency list as empty by making head as NULL 
int i; 
**for (i = 0; i < V; ++i) 
    graph->array[i]->head = NULL;** 

return graph; 
} 
+0

'graph-> массив [я]' не является указатель. – tkausl

+0

Ответы на такие основные вопросы можно найти в любом учебнике. Если у вас его еще нет, [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) - это хорошее место для Начало. –

ответ

0

Ну, это идет еще до C++, и наследуется от С.

В основном вы используете «->» на указатель, и «» по ссылке (или сказать, что это проще - простое значение). Что наследуется от C является то, что указатели и массивы взаимозаменяемы большую часть времени. Например. in

AdjList *array = /* allocate some memory */ 
array[0].head = nullptr; 

Итератор '[]' дает вам ссылку на 0-е поле.

Что интересно о вашем примере, является то, что он не использует некоторые основных хорошей особенности C++:

  • вы можете инициализировать поля в конструкторе, чтобы предотвратить всю эту инициализацию от вне
  • с использованием зОго :: вектора вместо самоподдерживающегося массива может быть намного проще
+0

есть десятки реальных примеров жизни, когда оба или оба запрещены. векторов, которых следует избегать на некоторых встроенных системах, у которых есть менеджер памяти, который не очищается после завершения процесса (и следующий экземпляр может быть запущен, наследуя память). Или из-за запрета на использование std :: namespace стандартом обзора кода.Инициализация из-за переключателей компилятора или стандартов проверки кода (упрощенная ручная проверка) – Swift

+0

@Swift как «std :: vector» плохо для очистки памяти? – Ap31

+0

@ Ap31: стандарт C++ подтверждает существование так называемых автономных реализаций, которые должны поддерживать только очень уменьшенный набор функций языка. Но в этом случае я думаю, что это красная сельдь; если вы не можете использовать 'std :: vector' из-за определенных ограничений памяти, то вы, вероятно, не сможете использовать' new' или даже 'malloc'. Запрет 'std ::' или списков инициализации больше похож на проблему с 20-летними базовыми кодами (или 20-летними компиляторами). Маловероятно, что все это отдаленно относится к OP. –

-1

graph->array[i] является объектом, а не указатель, поэтому вы должны получить доступ к членам этих корыта . оператора. -> используется, когда у вас есть указатель на структуру/класс и вы хотите получить доступ к его членам без разыменования (aka (*pointer).field).

Кроме того, имейте в виду, что в C++ вы должны лучше использовать new & delete вместо malloc & free и nullptr вместо NULL.

+0

Я не понимаю, это объект, но указатель. Можете ли вы привести пример для этого. –

+0

Нет, у вас либо есть объект, либо указатель на объект. Например. 'auto ptr = & x; auto & ref = x', 'ptr' - это указатель, и вы * имеете * для использования' -> ',' ref' является ссылкой, и вы обязаны использовать '.', нет исключений (если вы не перегружаете' - > ', но, насколько я знаю, это пока невозможно). –

+0

Указатели ** - ** объекты. В вашем примере переменная с именем 'ptr' относится к этому объекту-указателю. 'ref', напротив, является именем ссылки, а ссылки не являются самими объектами. Вы также можете создать ссылку на указатель; синтаксис затем становится '->', потому что после инициализации ссылка обрабатывается точно так же, как и объект-указатель, на который он ссылается. Например, 'auto & reference_to_pointer = ptr; reference_to_pointer-> независимо; '. –