2016-08-03 2 views
-2

저는 초급 프로그래머입니다. 일주일 전에 링크 된 목록에 소개되었지만, 저는 아직도이 문제를 해결하기 위해 고심하고 있습니다.C 프로그래밍 : 링크 된 목록의 마지막 요소를 팝하는 방법?

현재 연결된 목록에서 마지막 요소를 제거하는 데 도움이되는 함수를 작성하려고합니다. 나는 내가 여기서 잘못하고있는 몇 가지 설명을 고맙게 생각한다. 어떤 제안이있어 주셔서 감사합니다.

typedef struct node { 
    ElemType val; 
    struct node *next; 
} NODE; 

struct list_struct { 
    NODE *front; 
    NODE *back; 
}; 

그리고 heres는 내 현재 코드 : 목록이 비어있는 경우

, 우리는 아무것도하지 않고

내가 만지거나 현재 구조체

다음

을 수정할 수 아니에요

내 구조체입니다 임의의 값 을 반환하면 목록의 마지막 요소가 제거되고 값이 반환됩니다.

ElemType lst_pop_back(LIST *l) { 


    NODE * p = l->front; 
    NODE * trail = l->front; 


    if(p == NULL) return 0; 

    if(lst_len(l) == 1){ 
     free(p); 
     l->front = NULL; 
     l->back = NULL; 
    } 
    else{ 
     p=p->next; 

     while(p != NULL){ 

      if(p->next == NULL) free(p); 

      trail = trail->next; 
      p=p->next; 
     } 
     trail= trail->next; 
     trail->next= NULL; 

    } 
    return 0; 
} 

나는 MAC에 엑스 코드를 사용하고 있는데 내가 오류는 다음과 같습니다 스레드 1 : EXC_ACCESS (코드 = 1, 주소 = 0x8이) 내가 생각

+3

내가 잘못 여기서 뭐하는거야 * - 당신이 뭔가 잘못하고 있다고 생각 왜.? 오류/segfault/예기치 않은 결과가 표시됩니까? –

+2

좋아요, 그래서 당신은 제목을 다시 이중 링크 된 목록을 변경했습니다. 이제는 원래 "오프 주제"주석으로 돌아가 보겠습니다. 단 하나의 링크 된 목록 만 가지고있는 경우'list_struct'에있는'back' 멤버의 요점은 무엇입니까? – John3136

+1

독자적으로 링크 된 목록을 구성 할 때 뭔가 잘못된 것처럼 보입니다. 소스 코드의 일부를 추가하십시오. – mash

답변

-1

당신이지고있어 오류가 때를 어떻게됩니까 이미 할당 해제 된 항목에 액세스하십시오. 여기서 당신이하고있는 것입니다 :

목록 구조에는 백 포인터가 포함되어 있으므로 도움이 될 것입니다. p->next이리스트의 백 포인터와 동일한 것을 가리킬 때까지 p을 목록으로 이동시킨 다음 p->next을 null로 만들 수 있습니다.

또한 목록에서 POP 또는 REMOVE 기능을 사용해야합니까? 귀하의 질문에 제거 말했지만 함수의 이름은 lst_pop_back입니다. 팝하는 경우 마지막 값도 반환해야합니다.

+2

당신은 그것이 두 배의 자유가 될 것이라고 생각하게합니까? – mash

+0

pop이 제거되어 반환됩니다. 나는 OP가 그 부분을 분명히했다고 생각한다. 비록 그가 리턴 타입이 int에 대한 typedef 인 ElemType이라는 것을 볼 수있는 무언가를 구현하지 못한다고해도 말이다. – mash

0

XCode 오류 EXC_BAD_ACCESS(code=1, address=0x8)은 누군가가 액세스 할 수없는 메모리에 액세스하려고한다는 것을 의미합니다. Xcode의 바운더리 검사는 좋은 것으로 알려져 있으므로이를 신뢰합시다. OP가 우리에게 정확한 라인 번호를 알려주지는 않지만 조금은 추측 할 수 있다는 것이 슬픈 일입니다. 나는 Katerina B.와 여기에서 동의 할 것이고 범인과 같은 줄을 추측 할 것이다. 상세

: 나는 몇 가지 설명을 부탁드립니다 *

ElemType lst_pop_back(LIST * l) 
{ 
    // p and trail point to the first node 
    NODE *p = l->front; 
    NODE *trail = l->front; 

    if (p == NULL) 
    return 0; 

    if (lst_len(l) == 1) { 
    free(p); 
    l->front = NULL; 
    l->back = NULL; 
    } else { 
    p = p->next; 
    // Now: trail->next points to the old p 
    // and p to p->next, that is: trail points 
    // to the node before p 

    // while trail is not the last node 
    while (p != NULL) { 
     // if p is the last node 
     if (p->next == NULL){ 
     // release memory of p, p points to nowhere from now on 
     free(p); 
     } 
     // Following comments assume that p got free()'d at this point 

     // because trail points to the node before p 
     // trail->next points to the node p pointed to 
     // before but p got just free()'d 
     trail = trail->next; 
     // p got free()'d so p->next is not defined 
     p = p->next; 
    } 
    // assuming p got free()'d than trail->next is one step 
    // further into unknown, pardon, undefined territory 
    trail = trail->next; 
    trail->next = NULL; 

    } 
    return 0; 
} 
관련 문제