Как правильно реализовать эту функцию создания? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь создать функцию для создания очереди с приоритетами. Мои структуры таковы:

struct node {
  char *item;
  struct node *next;
};

struct queue {
  struct node *start;
  struct node *end;
};

struct priority_queue {
  struct queue **aoq;
  int x;
};

Моя функция, которую я хочу реализовать:

struct priority_queue *priority_queue_create(int x);

Здесь, как видно из структуры priority_queue, структура queue ** aoq по сути является массивом очередей, которые я хочу. int x, как и в заголовке функции, это количество очередей в массиве.

Мое предположение заключается в следующем:

struct priority_queue *priority_queue_create(int x) {
  struct priority_queue *pq = malloc(sizeof(struct priority_queue));
  pq->x = x;
  pq->aoq = malloc(x* sizeof(struct queue));
  return pq;
}

Там, где я положил 3 строки комментария в приведенном выше коде, я подозреваю, что это моя ошибка. Я хочу иметь возможность сделать что-то вроде: если x = 3, должен быть массив с 3 очередями, и я предполагаю, что я смогу получить к нему доступ, выполнив что-то вроде

pq->aoq[0] /// to access the first queue in the array, or
pq->aoq[2] /// to access the third queue in the array

Может кто-нибудь помочь мне исправить мою реализацию? Заранее спасибо.


Редактировать: Другие реализации, которые я пробовал:

struct priority_queue *priority_queue_create(int x) {
  struct priority_queue *pq = malloc(sizeof(struct priority_queue *));
  pq->x = x;
  pq->aoq = malloc(x * sizeof(struct queue *));
  for (int i = 0; i < x; ++i) {
    pq->aoq[i] = malloc(sizeof(struct queue));
  }
  return pq;
}

1 Ответ

0 голосов
/ 09 апреля 2020

Из кода, который вы разместили, я думаю, что это функциональность, которую вы хотите. Вы пропустили выделение памяти для очередей внутри struct priority_queue, то есть:

pq-> aoq = malloc( x * sizeof(struct queue *));

Добавление этого и сохранение того, что у вас уже было (с примером основной функции для тестирования функции priority_queue_create ()), у нас есть следующий код:

#include <stdio.h>
#include <stdlib.h>

struct node {
    char *item;
    struct node *next;
};

struct queue {
    struct node *start;
    struct node *end;
};

struct priority_queue {
    struct queue **aoq;
    int x;
};


struct priority_queue *priority_queue_create(int x) {
    struct priority_queue *pq = malloc(sizeof(struct priority_queue *));
    pq->x = x;

    pq-> aoq = malloc( x * sizeof(struct queue *));

    for (int i = 0; i < x; ++i) {
       pq->aoq[i] = malloc(sizeof(struct queue)); ///
    }

    return pq;
}

int main(){

    struct priority_queue * pq = priority_queue_create(3);
    char * str1 = "abcd";
    char * str2 = "abcde";

    pq->aoq[0]->start = malloc(sizeof(struct node));
    pq->aoq[2]->start = malloc(sizeof(struct node)); 
    pq->aoq[0]->start->item = str1;
    pq->aoq[2]->start->item = str2;

    printf("%s - %s\n", pq->aoq[0]->start->item,  pq->aoq[2]->start->item);

    free(pq->aoq[0]->start);
    free(pq->aoq[2]->start);
    free(pq->aoq[0]);
    free(pq->aoq[1]);
    free(pq->aoq[2]);
    free(pq->aoq);
    free(pq);

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