2015-07-06 2 views
0

Я пытаюсь понять, как выполняется оператор в состоянии while while(C), проверяя, является ли один связанный список пустым.Проверка того, что связанный список пуст в C++

node* remove(nodo*C, int y){ 
    FIFO F;        
    while(C){       
    if(C->info==y) {      
     node* p=C;     
     C=C->next;     
     delete p;     
     } 
    else {       
     F=metti_fondo(F,C);   
     C=C->next;     
     }        
    } 
    if(F.fine)       
     F.fine->next=0;     
    return F.primo; 

тип данных используется:

struct node{int info; node* next; node(int a=0, node* b=0){info=a; next=b;}}; 

То, что я, не понимая, как простое обращение узла C достаточно, чтобы проверить, если список не пуст. Разве это не должно быть while(C->next == 0) или что-то в этом роде? Я проверил, и моя версия не работает, а код, показанный ранее, работает хорошо.

Что он точно проверяет, когда я только ссылаюсь на узел C, без ссылки на информацию или на следующие поля?

Заранее спасибо

+1

Очень простой. Связанный список пуст, если оба указателя головы и хвоста имеют значение NULL. –

+0

Ну, если у него есть хотя бы один элемент, он не пуст, почему вы хотите проверить более одного, когда условие уже выполнено? –

+1

Fyi, 'while (C)' означает ", а C не является нулевым". –

ответ

0

Я бы предположил, что если связанный список действительно «пуст», указатель будет пустым. Затем нулевое значение преобразуется в значение false в пределах проверки if. C-> next == 0 (вероятно, нужно также проверить значение null здесь) проверит, не был ли у первого узла связанного списка не дочерний узел.

Связанный список состоит из узлов, и каждый узел указывает на следующий узел. В простой реализации последний узел просто указывает на null.

, если записать его в качестве узла (VAL) -> следующая потом что-то вроде N1 (0) -> N2 (10) -> N3 (3) -> нулевой

Мы могли бы N1 (0) -> null

и список не будет пустым, но проверка C-> next будет по-прежнему равна нулю. Пустым списком будет только null

0

Условный в то время как оператор принимает значение либо истинным, либо ложным, в зависимости от параметра. В этом случае я считаю, что условие будет оцениваться как false, если указатель C ссылается на нулевой адрес.

0

TL; DR: Он проверяет, присвоено ли «C» ненулевое значение.

В C и C++ утверждение ложно, если оно равно нулю (0), в противном случае оно равно true.

#include <iostream> 

int main() { 
    if (0) 
     std::cout << "never\n"; 
    if (42) 
     std::cout << "always\n"; 
    if (0.2) 
     std::cout << "al.ways\n"; 
} 

Так указатель вычисляется как false, когда он указывает на адрес памяти 0 - что делается для того, правильности, установив его в nullptr, NULL или 0, но имейте в виду, что NULL обычно #define 0 или #define 0ULL , Проблема с использованием целого числа 0 для указателей заключается в том, что ... это целое число. Что может привести к недоразумениям:

void f(int); 
void f(char*); 

f(0); // which one? 

Следующий код печатает «мир»:

#include <iostream> 

int main() { 
    const char* p = nullptr; 
    if (p) 
     std::cout << "hello"; 
    p = "world"; 
    if (p) 
     std::cout << p; 
    std::cout << "\n"; 
} 

(http://ideone.com/iy5GcX)

Таким образом, в общих связанных реализаций списка, истекшим списка представлен нулевой указатель, и поэтому пустота может быть обнаружена головой списка, являющимся концом, т. е. являющимся значением nullptr.

Node* head; 
/*...*/ 
if (head) { 
    // points to something, list is not empty 
} 

И конструкция

for (Node* node = head; node; node = node->next) { 
    ... 
} 

будет «короткое замыкание», если список пуст: узел изначально присваивается значение головы. Если голова равна нулю, первое испытание завершится ошибкой (... ; node ; ...), и никакие итерации не будут выполнены.