Можно ли сделать массив структур типа узла? - PullRequest
0 голосов
/ 30 апреля 2018

Мне было просто интересно. Скажем, вам нужно сохранить эти значения:

Часы Протокол

внутри массива, логически возможна следующая реализация?

struct node
{
int hour;
int minutes;
};


int main()
{
int numOfLanding, minGap, hour, minutes;
cin>>numOfLanding;
cin>>minGap;
cout<<endl;

struct node *arr[numOfLanding];

for (int i=0; i<numOfLanding; i++)
{
    cin>>hour;
    cin>>minutes;
    arr[i]->hour=hour;
    arr[i]->minutes=minutes;
}

Я все еще очень стараюсь понять логику структурных узлов. Любая помощь будет высоко ценится!

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Что вы спрашиваете: возможно ли создать массив такого размера, который неизвестен во время компиляции, но только во время выполнения? Да, вы можете, но выбранный вами способ не является стандартным C ++: объявление массива, например

struct node *arr[numOfLanding];

означает использование " массива переменной длины ", который не является (и никогда не был) частью стандарта C ++. Это было частью C, однако, в C99, но затем комитет решил сделать его необязательным в C11. В любом случае можно найти компилятор C ++, который поддерживает эту функцию как расширение: например, gcc. Но если вы используете его, имейте в виду, что ваш код не является переносимым.

Стандартный способ сделать это в C ++ - использовать new[]:

node* arr = new node[numOfLanding];

(обратите внимание, что использование ключевого слова struct - это то, что вы делаете в C; в C ++ это не требуется)

На этом этапе вы получаете доступ к каждому элементу, используя ., а не ->:

arr[i].hour=hour;
arr[i].minutes=minutes;

После того, как вы закончили использовать массив, вы должны удалить его, используя:

delete[] arr;

Во всяком случае, этот стиль старый и в наши дни считается плохим. Предпочтительным подходом является использование контейнера, который автоматически определяет размер для вас, и который будет управлять памятью, так что вам не нужно беспокоиться о new[] и delete[]. Лучшим контейнером для этого является std :: vector . Чтобы использовать его, сначала вам нужно #include <vector>, а затем вы можете использовать его так:

std::vector<node> arr(numOfLanding);

for (auto& curr_node : arr) {
    cin>>hour;
    cin>>minutes;
    curr_node.hour=hour;
    curr_node.minutes=minutes;
}
0 голосов
/ 30 апреля 2018

Да, вы можете иметь массив узлов.

Однако, если вы настаиваете на массиве и не знаете емкости во время компиляции, вам придется распределить ее во время выполнения:

struct node
{
  int hour;
  int minutes;
};


int main()
{
  int numOfLanding, minGap, hour, minutes;
  cin>>numOfLanding;
  cin>>minGap;
  cout<<endl;

  node *arr = new node[numOfLanding];

  for (int i=0; i<numOfLanding; i++)
  {
      cin>>hour;
      cin>>minutes;
      arr[i].hour=hour;
      arr[i].minutes=minutes;
  }

  // Remember to delete the array.
  delete[] arr;
  return EXIT_SUCCESS;
}

Более безопасной альтернативой является использование std::vector<node>.

Примечание. Поскольку это массив, используйте '.' для доступа, а не ->.

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