Как использовать массив указателей в main?

Я пытался задать свой вопрос, но, похоже, я задаю его неправильно, и я застрял уже 2 месяца. (что печально)

Только для справки: я построил связанный список из узлов:

struct node  {
int number;
node *next;  }; 

Чтобы связать их в основном, я использовал -> для присвоения значений

void insertAsFirstElement(node *&head, node *&tail, int number){
node *temp = new node; 
temp->number = number;
temp->next = NULL; 
head = temp;
tail = temp; }

Теперь я пытаюсь создать список пропусков, который должен иметь ту же структуру, что и мой исходный узел, за исключением того, что node* next должен быть массивом указателей типа node.

struct node {
int number;
node *next[3];
};

Я запутался в том, как иметь массив указателей узлов. Я заметил, что они имеют тенденцию выглядеть так: node **next, а затем объявлено, что память выделяется динамически. Я просто хочу, чтобы мои массивы имели размер 4. Итак, [3].

Моя проблема в том, как я могу создать новые узлы с массивом указателей узлов в main() и поместить что-то в первый слот массива узлов?

Это не работает для помещения вещей в массив, но работает для ввода числа.

void insertAsFirstElement(node *&head, node *&tail, int number){

node *temp = new node; 
temp->number = number;
cout<<temp->number<<endl;
temp->next[0] = tail; 
cout<<temp->next[0]<<endl;
head->next[0] = temp;
cout<<head->next[0]<<endl;
}

Помогите мне, пожалуйста.


person user2899211    schedule 27.02.2015    source источник
comment
Это не работает; у вас есть ошибки синтаксиса/компилятора? Или ошибки поведения/ошибки сегмента?   -  person Jason C    schedule 27.02.2015
comment
короткий комментарий: массив из 4 больших выделяется как node* next[4]. Индексация 4-го элемента mynode->next[3].   -  person xtofl    schedule 27.02.2015


Ответы (2)


Оператор -> является сокращением.

Без оператора -> вы бы написали

(*var).prop;

С помощью оператора -> вы пишете:

var->prop;

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

void StoreNode(node *node){
    node *temp = new node;
    temp->next[0]=node;
}

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

temp->next[0]->number

что то же самое, что писать

(*temp).next[0]->number

что то же самое, что писать

( *((*temp).next[0]) ).number

Эта строка вашего кода кажется немного запутанной:

void insertAsFirstElement(node *&head, node *&tail, int number){

Помните, вы просто передаете своей функции адрес узла. Поэтому все, что вам нужно, это

void insertAsFirstElement(node *head, node *tail, int number){

Внутри самой функции вам нужно будет найти правильное место в списке, то есть когда вы попадете в нотации **.

person Richard    schedule 27.02.2015

Код на первый взгляд кажется нормальным. Массив указателей — это просто массив элементов, каждый из которых является указателем, и вы используете его точно с синтаксисом, который показывает ваш код.

Обратите внимание, однако, что при объявлении массива указателей внутри класса элементы не инициализируются автоматически, поэтому вы, вероятно, захотите исправить элементы, которые еще не используются, в NULL. Более того, в списке пропуска вам, вероятно, понадобится знать, на каком «уровне» был вставлен узел.

Вы уверены, что ваша проблема именно в этой части? Часто в C++ ошибка появляется не сразу в момент ее совершения, а гораздо позже. Это происходит из-за правила языка "неопределенное поведение" (он же "программисты никогда не ошибаются").

person 6502    schedule 27.02.2015
comment
Я собирался использовать массивы в качестве уровней, потому что думал, что вы можете контролировать положение элементов, входящих в массив? Значит на уровне 0 будут все элементы. Во время вставки другой указатель может быть сохранен на уровне 1, создавая новый уровень из головного узла. Я думаю, мне нужно вернуться и изучить массивы сейчас. - person user2899211; 27.02.2015
comment
@ user2899211: Это зависит от того, что вы хотите поддерживать в своем списке пропуска. Но, учитывая элемент, как узнать, используется ли единственный указатель 0 или используется также 1? Массив не знает количество допустимых элементов в нем; он просто имеет фиксированный заранее определенный размер. Вы можете искать std::vector, если вам нужен массив, размер которого можно изменять динамически. - person 6502; 27.02.2015
comment
хорошая точка зрения. По сути, я начну поиск с массива головных узлов [3], чтобы увидеть, есть ли у него указатель, и буду двигаться вниз, пока не встретит его. Это большая трата. Сейчас мне просто нужно что-нибудь создать и вернуться позже, когда я лучше разберусь. Было бы идеально добавить динамические уровни, но я пока не могу это запрограммировать. - person user2899211; 27.02.2015