-4

저는 C++을 사용하여 데이터 구조 과정을 진행하고 있으며 간단한 단일 링크 목록 구조를 구현해야합니다.C++에서 링크 된 목록이 비어 있는지 확인하기 위해 null 포인터에 액세스합니다.

나는 다른 모든 방법을 알아 냈습니다. 실제로 목록이 비어 있는지 확인하면 프로그램이 충돌하여 조각화 오류가 발생합니다.

: 비어 있지 않은 경우,이 같아야 반면> NULL

-

HEAD :

목록이 비어

는 내 연결리스트 구조를 같이하도록되어 HEAD -> ... -> NULL

내 isListEmpty는()과 같이 보인다 :

bool singleList::isListEmpty(void) { 
    return (head->next == NULL); 
} 

null 포인터에 액세스하려고 할 때 코어가 덤프되는 것이 확실하지만 어디에 있는지 잘 모르겠습니다. 내가 어디에서 봐야하는지에 대한 어떤 제안?

감사합니다.

--Edited--

미안 해요, 난 충분히 밝혀지지 않았다.

list.list_insert_front(guy1); 
list.list_insert_front(guy2); 
list.list_remove(guy1); 
list.list_remove(guy2); 
list.isListEmpty(); //This line causes segmentation fault. 
+5

'head'가 'NULL'일 가능성이 있다고 생각하십니까? 어쨌든 디버거를 사용하는 방법을 배우거나 [mcve]를 제공하십시오. – YSC

+0

'head'는 빈 목록에 대해'nullptr'이 아닌가요? 이는 기본 생성자 (아마도 빈 목록을 만드는)가'head'를 생성한다는 것을 의미합니다. 아마도 당신은'head'가 빈리스트에 대해'nullptr'인지를 확인하려고했을 것입니다. –

+0

삽입 및 제거 함수 호출이'head'가 null이 아니라는 것을 보장하지는 않습니다. 함수 내부에서 잘못된 링크를 추가하거나 제거 할 수 있습니다. 함수를'head == null'으로 변경하여 테스트하십시오. – Confuzing

답변

0

시대의 대부분의 빈 목록에 headnull입니다 :

나는 내 코드 일 경우 확인하면서, 내가 좋아하는 뭔가 일 때문에 확신 머리 자체가 널 포인터가 아니다 해요 , 아닙니다 next입니다.

초기화를 두 번보고 head 또는 nextnull으로 지정해야 할지를 결정하십시오.

+0

답변 해 주셔서 감사합니다. 그러나 "head"라는 요소가 항상 존재하고 링크 된 목록의 첫 번째 요소를 가리킬 수 있도록이 방법을 구현해야한다고 들었습니다. –

+0

@ 정진하 항상 머리가있을 수 있습니다. 그러나 첫 번째 요소가 없다면'head'는'NULL'입니다. – user463035818

+0

@ tobi303 와우 나는 너무 어리 석고 감사합니다. 나는 여전히 gdb를 사용하는 방법을 배우고 있는데,이 질문을 덜받는 데 도움이 될 것으로 생각된다. 고마워요! –

0

머리글은 목록의 첫 번째 노드의 트랙을 유지하는 포인터입니다. list가 비어 있으면 head는 null을 가리켜 야합니다.

head-> next에 액세스하려고하면 간접적으로 첫 번째 노드 (두 번째 노드)의 다음 노드가 있는지 여부를 확인합니다.

목록이 비어 있는지 확인하려면 head가 NULL인지 확인해야합니다.

bool singleList::isListEmpty(void) { 
    return (head == NULL); 
} 
+0

헤드는 목록에있는 항목 일 필요는 없으며 간단하게 목록을 추적하는 데 사용할 수 있습니다 (목록 작성 방법에 따라 다름). 동의 하긴하지만 그는 머리가 null인지 확인해야합니다. – Confuzing

+0

예, 머리는 단지 앵커 포인트입니다. 가장 단순한 구현에서는 추적을위한 포인터 일뿐입니다. 또한 NULL이 아닌 헤드 노드를 구현하여 목록 (예 : 크기, 노드 수, 액세스 시간 등)에 대한 메타 데이터와 첫 번째 데이터 노드에 대한 포인터를 보유 할 수 있습니다. – nyemul

0

내가 이해하는 한, 별도의 헤드 노드가 있다고 가정해도 목록이 비어있을 때마다 null이됩니다.

목록이 비어 있지 않은 경우에만 목록의 첫 번째 노드를 가리 킵니다.

예 :

LIST : A-> B-> C는 -> ...-> Z-> A. 머리를 가리킬 것이다 이때 널 는 (오히려 HEAD 될 것이다 예컨대 A.head = A)

+0

헤드 노드가 분리 된 경우 일반적으로 적어도 내 경험에 의하면 null이 아니기로되어 있습니다. 목록에 대한 데이터가 있거나 목록의 시작 부분을 가리키는 사용하지 않는 목록 항목이있는 별도의 클래스가 될 수 있습니다. Null은 단순히 첫 번째 항목에 대한 포인터이며 별도의 헤드 노드가 아니라는 것을 의미합니다. – Confuzing