2013-05-09 4 views
1

c의 링크 된 목록에서 항목을 삭제하려면 어떻게해야합니까?링크 된 목록에서 항목을 삭제합니다.

typedef struct 
{ 
    int n; 
    struct item *nexI; 

} item; 


#define na 1000 
int n, j; 

내 주에 있습니다

item * list[na]; 

n = 5; 

for(j = 0; j < na; j++) 
    remove_elem(list, n, j); 

지금 내 기능 remove_elem :

void remove_elem(item * list[], int n, int pos) 
{ 
    int i; 
    item * aux; 
    item * sec; 


    aux = list[pos]->nexI; 

    if(aux == NULL) 
     return; 
    else 
    { 
     sec = (item *)aux->nexI; 

     if(aux->n == n) 
     { 
     list[pos]->nexI = sec; 
      return; 
     free(aux); 
     } 

     while(sec != NULL) 
     { 

      if(sec->n == n) 
      { 
       aux->nexI = sec->nexI; 
       free(sec); 
       return; 
      } 
     aux = (item *) aux->nexI; 
     sec = (item *) sec->nexI; 
     } 
    } 

}

하지만이 코드는 내게 세그먼트 오류를주고 내가 통지를 캔트 왜 내가 여기서 잘못하고있는 걸 알아낼 수 있니?

+2

백만 번 반복. "연결된 목록에서 삭제"를 검색하십시오. –

+1

디버거에서 실행 해 보셨습니까? 충돌이 일어나는 곳을 알려줍니다. –

+0

그리고 디버거에서 세그먼테이션 오류가 발생하는 위치는 어디입니까? 그리고 그 시점에서 변수 값은 무엇 이었습니까? – Useless

답변

2

코드에 따라 엄격히 살펴보면, 초기화되지 않은 포인터에 관한 것이라고 생각합니다. 당신은 포인터의 배열을 선언 할 때

첫째, 당신은 NULL 모든 포인터를 초기화해야합니다

다음
item * list[na] = { NULL }; 

귀하의 모든 기능에 NULL 포인터를 확인해야합니다

void remove_elem(item * list[], int n, int pos) 
{ 
    if (list[pos] == NULL) 
     return; 

    /* ... */ 
} 

와의를 물론 새 노드를 할당 할 때 nexI 포인터를 NULL 포인터로 설정하거나 if(aux == NULL) 같은 검사가 작동하지 않습니다.

+0

답장을 보내 주셔서 감사합니다! 정확한 순간에 당신은 나에게 그 대답을 주었다. 나는 그 실종 사례를 이해했다. 그런 혼란. 다시 한 번 감사드립니다. 이제 모든 것이 잘 작동합니다! :) – gn66

관련 문제