Как получить доступ к спискам связанных массивов в куче? - PullRequest
1 голос
/ 11 апреля 2019

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

struct node{
    int distance;
    int destination;
    int weight;
    node *adj;
}; 

struct adjList{
    struct node *node;
    adjList *array;
};// adjList a is made out of an array of "nodes". Essentially each element in the adjList  a should have a pointer to a subarray of "nodes" that i can access.


a=(adjList*) malloc(numOfNodes * sizeof(struct adjList));//allocate space for array of linked lists


for(int j=0; j<numOfNodes; j++){
    array[j].node=malloc(numOfEdges * sizeof(struct node));//allocate space for each linked list in the array
                }


  for(int j=0; j<numOfNodes; j++){
   a[j].node->adj[j]=NULL; //trying to set the "jth's" element of the adjacencylist's "jth" node. This syntax does not work as the compiler wont let me even use it.
      }  

Моя цель - создать массив связанных списков. Не уверен, почему этот метод не работает.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

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

struct node **array = malloc(sizeof(struct node*) * arraySize /* numOfNodes */);

Теперь array[i] будет указывать на ith связанный список.

for(int i=0; i<arraySize ; i++){
    struct node *head = NULL;
    /* Allocate nodes for ith linked list */
    for(int j=0; j<numOfNodes; j++) {
        if(0 == j) {
            array[i] = malloc(sizeof(struct node)); //First node of ith linked list
            memset(array[i], 0, sizeof(struct node)); //OR you can use calloc. Required to remove junk pointers in node.
            head = array[i];
        } else {
            head->adj = malloc(sizeof(struct node)); /* Allocate jth node */
            memset(head->adj, 0, sizeof(struct node)); //OR you can use calloc. Required to remove junk pointers in node.
            head = head->adj;
        }
    }
}

Вы можете просмотреть ith связанный список, как показано ниже.

struct node *head = array[i];
while(head) {
    printf("\ndist %d dest %d weight %d\n", head->distance, head->destination, head->weight);
    head = head->adj;
}
0 голосов
/ 11 апреля 2019

Вы должны прочитать справочную страницу malloc (3) , в частности, часть calloc ().

Недостаточно просто поместить указатель в структуру и предположить, что магическим образомбудет массив.Вы должны зарезервировать для него память, используя функции, описанные на этой странице руководства.И что более важно, вы должны free() зарезервировать память, когда она вам больше не нужна.

Также вам следует подумать о том, чтобы сделать длину вашего массива частью вашей структуры.Вот так:

struct node{
    int distance;
    int destination;
    int weight;
    node *adj;
    size_t adj_count;
}; 

struct adjList{
    struct node *node;
    size_t node_count;
    adjList *next; // I renamed this member to next,
                   // which makes it more clear that this is a linked list
};

РЕДАКТИРОВАТЬ: После того, как вы отредактировали свой вопрос, внезапно появляется malloc (), но это, безусловно, неправильно.Или ваши названия структур данных вводят в заблуждение.

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