2013-10-02 3 views
1

Пусть я реализую проект связного списка, и я STRUCT узел:Стрелка LinkedList

struct node{ 

    node *prev; 
    node *next; 
    int data 
    }; 
    node *sentinel; 

каждый раз, когда я использую добавить() метод, который держать добавление элементов в списке, как:

add(1); //First node 
add(2); //Second node 
add(3); //Third node 
add(4); //Fourth node 
add(5); //Fifth node; 

Так после того, как я закончу, добавив, и я хочу сделать тест позволяет сказать:

node *temp = sentinel->next; 

Так же точки временные к первому Eleme нт? что, если я делаю:

node *temp = (sentinel->next)-next; 

делает это временные точки ко второму элементу сейчас?

Если да, то почему? И какова основная цель

node *sentinel; 

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

Edit: 

У меня будет конструктор, инициализирующий дозор, как: sentinel = new node();

Я скажу, что мой метод add() похож;

add(int data, index) 

{

sentinel *temp = (sentinel->head); //Lets say temp points to the head of list here. 
node *toAdd = new node(); 
toAdd->data = data; 
toAdd->next -> temp; 
temp->next = toAdd; 

}

+0

Другие, чем синтаксис декларации структуры, это ближе к вопросу C, чем C++. Но кроме этого * вам не нужно выделение узла-дозорчика. * Если вы собираетесь использовать этот маршрут (и я бы не хотел, я бы использовал 'std :: list <>' или 'std :: vector < > ', или даже' std :: deque <> '), тогда' nullptr' делает чертовски точное контрольное значение, которое легко тестируется, и никогда не вводит несколько раздражающих проблем, поскольку «дозорные» узлы всегда заканчиваются всплытием. В: Мой список пуст? A: 'if (! Head_ptr)' – WhozCraig

+0

Представленный вами код не содержит достаточной информации для ответа на ваш вопрос. Как реализовано 'add' и как инициализируется и используется' sentinel'? –

ответ

1

После выполнения node *temp = (sentinel->next)->next;, предполагая, что существует третий элемент, температура должна указывать на него. Это связано с тем, что переменная sentinel всегда указывает на первый элемент списка, поэтому мы не теряем этот указатель. Это предполагает, что ваш метод добавления работает, установив значение дозорного, а затем следующие указатели последнего элемента.

В качестве примера добавить метод:

void add(int data){ 
    //If the list is empty, set the sentinel value 
    if(sentinel == 0){ 
     sentinel = new node(); 
     sentinel->data = data; 
     sentinel->next = 0; 
    } 
    else{ 
     //Else, find the last element 
     node* temp; 
     //Loops until nodes next is null (node is last node) 
     for(temp = sentinel;temp->next != 0;temp = temp->next); 

     //Create the next node and set it to next 
     temp->next = new node(); 
     temp->next->data = data; 
     temp->next->next = 0; 
    } 
} 
+0

Это то, о чем я смущен. если мой метод добавления работает, установив значение дозорного, наконец, дозорный предположительно указывает на последний элемент в списке, не так ли?Итак, если я вызову sntinel-> next после завершения метода add(), почему бы не указать на последний элемент в списке? – 14K

+0

Ваш метод добавления должен установить значение дозорного значения, если оно равно 0 (null), тогда вы можете найти последний элемент (цикл до -> следующий равен 0) или сохранить последнее значение. Если дозорный элемент не является нулевым, ваш метод добавления должен установить «следующее» значение того, что вы считаете последним. – Sinkingpoint

+0

@ 14K Добавлен метод добавления образца, чтобы описать процесс ... – Sinkingpoint

3

сторожевого * Темп = (sentinel-> голова); Я думаю, что линия не соответствует действительности. Becouse you dos'nt intialize head в struct. Итак, вы просто intialize sateniel = null;

toAdd->data=data 
\\then add 
if(sateniel==null) 
{ 
sateniel=toAdd; 
    sateniel->prev=null; 
    node *temp=sateniel; 
} 
else 
{ 
    toAdd->prev -> temp; 
    temp->next = toAdd; 
    temp=toAdd; 
} 

попробуйте путешествовать по списку