массив не хранящий адрес структуры - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь реализовать граф, используя список смежности, насколько я знаю, насколько я узнал, если создал переменную array, указывающую на struct adjlistnode размера v*sizeof(struct adjlistnode) thin, я могу хранить адреса v struct adjlistnode введите узел в каждом индексе массива

Означает, что каждый индекс массива будет указывать на узел типа struct adjlistnode, но когда я присваиваю G->array[i]=NULL, это дает мне ошибку

||=== Build: Debug in teeest (compiler: GNU GCC Compiler) ===| C:\Users\Mahi\Desktop\DATA STR\teeest\main.c||In function 'creategraph':| C:\Users\Mahi\Desktop\DATA STR\teeest\main.c|59|error: incompatible types when assigning to type 'struct adjlistnode' from type 'void *'| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

почему я не могу назначить NULL для индекса массива

что мне делать, если я хочу получить доступ к списку смежности, например, используя G->array[i] = первый узеладрес, смежный с i-й вершиной графа, и позже я добавлю другой узел, если необходимо

struct adjlistnode{
    int dest;
    struct adjlistnode* next;
};
struct graph{
   int V;
   struct adjlistnode* array;
};
struct adjlistnode* getnewnode(int dest){
   struct adjlistnode* newnode =(struct adjlistnode*)malloc(sizeof(struct adjlistnode));
   newnode->dest=dest;
   newnode->next=NULL;
   return newnode;
}
struct graph* creategraph(int v){
   struct graph* G=(struct graph*)malloc(sizeof(struct graph));
   G->V=v;
   G->array=(struct adjlistnode*)malloc(v*sizeof(struct adjlistnode));

   for(int i=0;i<v;i++){
      G->array[i] =NULL;
   }
   return G;

}

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

G->array имеет тип struct adjlistnode *

Но

G->array[i] имеет тип struct adjlistnode.

Таким образом, вы не можете назначить NULL (извведите void *) - G->array[i] типа struct adjlistnode

Возможно, вам придется определить array в struct graph как указатель на указатель

struct graph{
   int V;
   struct adjlistnode** array;
};

, а затем следующее должно работать для вас

struct graph* creategraph(int v){
   struct graph* G=malloc(sizeof(struct graph));
   G->V=v;
   G->array=malloc(v*sizeof(struct adjlistnode*));

   for(int i=0;i<v;i++){
      G->array[i] =NULL;
   }
   return G;

}

** Note1 (как также упомянуто @alk в комментариях), что в C, по крайней мере, начиная со стандарта C89,malloc возвращает void *.void * можно присвоить любому другому типу указателя (и наоборот), поэтому приведение к возвращаемому значению malloc не требуется.

** Note2 (также отмечено @alk) что сигнатура malloc определяется параметром типа size_t, а не int, поэтому лучше немного изменить код и использовать правильный тип (прочитайте , сравнивая int с size_t и size_t против int в C ++ и / или C для получения дополнительной информации)

0 голосов
/ 27 сентября 2018

G->array[i] возвращает *(array + i * sizeof(struct adjlistnode)), как если бы array было struct adjlistnode array[].

Что вы делаете, это сохраняете v объектов struct, но вы пытаетесь инициализировать их с NULL, как если бы вы это делалиуказатель.

Вероятно, вам понадобится

struct graph{
   int V;
   struct adjlistnode** array;
};

[...]

G->array=(struct adjlistnode**)malloc(v*sizeof(struct adjlistnode*));

. Это сделает array указателем на массив указателей.

Тогда G->array[i] вернетstruct adjlistnode* указатель на объект структуры, который затем можно инициализировать с помощью getnewnode().

0 голосов
/ 27 сентября 2018

array - это (одиночный) указатель на struct adjlistnode.Таким образом, он может быть установлен в NULL.

 G->array = NULL; //is okay

Но это не массив указателей, поэтому вы не можете получить доступ к элементам массива, и они также не могут быть установлены в NULL.

Для динамического размещения вы должны сделать следующее:

struct graph{
   int V;
   struct adjlistnode** array;
};
struct graph* creategraph(int v){
   struct graph* G = malloc(sizeof(struct graph));
   G->V = v;   
   G->array = malloc(v * sizeof(struct adjlistnode*)); //allocation for an array of v pointers 

   for(int i = 0; i < v; i++){    
      G->array[i] = NULL;
   }
   return G;
}

Как подсказывает @alk, лучше, если вы передадите v как size_t вместо int, так как malloc занимает size_t.

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