2011-03-07 4 views
3

C의 간단한 Linked List 구현에서 insert()라는 함수 줄을 알 수 없습니다. char를 취하고 링크 된 목록에 알파벳순으로 추가합니다. 이 줄은 목록이 비어있을 때 새 노드를 만드는 것입니다. 그리고 목록에 하나의 노드가 있기 때문에, 내가 말한 것처럼 줄이 틀림없이 틀렸을까요?Linked-List 시작 부분에 새 노드 삽입

/****************************************************/ 

void insert(ListNodePtr *sPtr, char value){ 
ListNodePtr newPtr;  
ListNodePtr previousPtr; 
ListNodePtr currentPtr; 

newPtr = malloc(sizeof(ListNode)); 

if(newPtr != NULL){  //is space available 
    newPtr->data = value;  //place value in node 
    newPtr->nextPtr = NULL;  //node does not link to another node 

    previousPtr = NULL; 
    currentPtr = *sPtr;   //indirection to startPtr 

    while(currentPtr != NULL && value > currentPtr->data){ 
     previousPtr = currentPtr;    //walk to ... 
     currentPtr = currentPtr->nextPtr;  //... next node 
    } 

    //insert new node at the beginning of the list 
    if(previousPtr == NULL){ 
     newPtr->nextPtr = *sPtr;   /////////////////////////////////////////////// newPtr->nextPtr = NULL ??? 
     *sPtr = newPtr; 
    } 
    else{   //insert new node between previousPtr and currentPtr 
     previousPtr->nextPtr = newPtr; 
     newPtr->nextPtr = currentPtr; 
    } 

} 
else 
    printf("%c not inserted. No memory available.\n", value); 
}//end-of insert 

/*******************************************************/ 

main()의 typedef 명령은 다음과 같습니다.

typedef struct listNode ListNode; 
typedef ListNode* ListNodePtr; 

그리고 insert() 함수는 main()에서 이와 같이 호출됩니다.

insert(&startPtr, item); 

main()에서 startPointer를 초기화합니다.

ListNodePtr startPtr = NULL; 

답변

3

사례를 잊어 버린 것 같습니다.

  • 목록
  • 문자가 목록에있는 모든 다른 문자보다 작은 비어 있고 목록의 시작 부분에 삽입해야하는 경우 표시된 선은 호출됩니다

으로

while(currentPtr != NULL && value > currentPtr->data){ 
    previousPtr = currentPtr;    //walk to ... 
    currentPtr = currentPtr->nextPtr;  //... next node 
} 

당신이 선에 도달 할 수 있도록 조건 value > currentPtr->data이, 두 번째 경우에 해당됩니다 두 번째 경우를 이해하기 전에 코드를 살펴있다 previousPtr == NULL*sPtr != NULL (초기 값, 목록의 첫 번째 노드에 대한 포인터 포함). 첫 번째 경우에

*sPtr는 두 번째 경우에, 당신이 잘못 NULL를 사용하는 경우 전체 목록을 던져 것 단 하나의 목록에서 문자 및 메모리 누수와 끝까지, 참으로 NULL입니다.

+0

아아, 내가 대답을 게시 한대로 바로 편집했습니다. 좋은 캐치 – DTing

1

* sPtr을 함수에 전달 중입니다. * sPtr이 비어 있지 않은 목록의 Node를 가리키는 경우 * sPtr 대신 NULL을 사용하면 목록에 대한 참조가 손실됩니다. * sPtr이 NULL이면 동작은 동일합니다.

if(previousPtr == NULL){ 
     newPtr->nextPtr = NULL; 
     *sPtr = newPtr; 
    } 

을하지만 * sPtr = 노드 1과 목록 인 경우 :

당신이 제안되어 구현

Node1->Node2->Node3 

당신은 노드 1 전에 삽입 할 경우 당신은 사용

당신에게 newPtr-> NULL을 가리키게합니다 다음 * sPtr = newPtr을 설정하고 원래 목록을 잃습니다

다른 구현은 새 노드를 이전 목록에 추가합니다.

관련 문제