2012-10-11 3 views
1

처음으로 연결된 목록을 구성하려고 시도하고 있으며 basic 소개를 읽은 후 다음을 수행했습니다.글로벌 연결 목록에 노드 추가

struct errorNode errorList = {0, NULL}; 

이 삽입 내 현재 프로젝트를 구성하는 각 라이브러리를 허용하기 위해 수행되었습니다로

struct errorNode { 
    uint8 error; 
    struct errorNode* next; 
}; 

둘째, 전 세계적으로 첫 번째 노드를 정의로 첫째, 연결리스트 노드 선언 오류를 공통 목록으로 이 기능은 다음과 같습니다.

이 것은 오류없이 컴파일되지만 예상대로 작동하지 않습니다. 내가 문제는 목록 쓰기 기능의 마지막 두 문장과 관련이 있지만 확실하지 않습니다. 내가 잘못하고있는 것에 대한 힌트가 가장 감사 할 것입니다.

답변

1

문제는 당신이 원형 목록을 만들 것입니다.

newNode->next = &errorList; 

그래서 newNode은 글로벌 노드에 연결됩니다.

errorList = *newNode; 

이것은 errorList.error = newNode->error; errorList.next = newNode->next;과 동일합니다. 이제 errorList은 글로벌 노드에 연결됩니다. 죄송합니다. 이것은 당신이 모든 글로벌 노드를 원하는 가정한다

newNode->next = errorList.next; 
errorList.next = newNode; 

:

는 대신 무엇을 할 수 있는지, 후 목록에서 글로벌 노드를 새 노드 를 삽입합니다. 당신이 경우에, 당신은 struct errorNode *errorList = 0; 시작,이 같은 새 노드를 추가 할 수 있습니다 : 당신이 목록을 사용하여 올 때

newNode->next = errorList; 
errorList = newNode; 

, 당신의리스트 탐색은 약간 다를 수 있습니다. 전역 포인터 포인터를 사용하면 첫 번째 노드에 대한 포인터로 시작하므로 사용하기 전에 null을 확인해야합니다. 글로벌 노드를 사용하면 확실히 존재하지만 다음 포인터가 null 일 수있는 노드부터 시작합니다.

머리 (errorList)는 포인터해야하고 0의 값을 가지는 노드의 초기 항목에 대한 필요가 없다면 NULL로 초기화되어야한다
+0

... 오류 코드는 항상 0입니다. – Vlad

0

errorList이

도이 목록의 머리가 수정되지 않습니다 수정되는 마지막 노드 무엇인지 알 필요가 첫 번째 노드 (하지 첫 번째 노드)에 대한 포인터해야한다, 그것은 사용됩니다 목록의 처음부터 여행하고 싶을 때만.

1

글쎄, 문제는 마지막 줄에 있습니다 : 단지 은 이전 오류 노드에있는 데이터를 덮어 씁니다!

아마도 첫 번째 노드 자체가 아닌 머리글 (첫 번째 노드에 대한 포인터)을 전역 적으로 액세스 할 수 있어야합니다. 이렇게하면 목록에 가짜 항목이 필요하지 않습니다.

은 (코드는 스레드 안전하지 않습니다 경고합니다.)

코드 :

errorNode* pGlobalErrorList = NULL; 

// in errorListWrite 
newNode->next = pGlobalErrorList; 
pGlobalErrorList = newNode; 
1

:

struct errorNode* errorList = NULL; 

그런 다음 함수를 재 할당 할 필요를 errorList 제대로.

void errorListWrite(uint8 error) { 
    struct errorNode* newNode = malloc(sizeof(struct errorNode)); 

    newNode->error = error; 
    newNode->next = errorList; 

    errorList = newNode; 
} 

이것은 새 노드가 새 꼬리가 아니라 목록의 새 머리글이라고 가정합니다.