2017-10-18 2 views
-2

코드에서 세그먼트 오류가 계속 발생하지만 이유를 알 수 없습니다. int n은 내가 삭제할 노드입니다. 따라서 listDeleteNth(new, 2)은 시퀀스에서 3을 삭제합니다.링크 된 목록에서 특정 노드 삭제 C 프로그래밍

1-> 2-> 3-> 4

1-> 2-> 4

typedef struct _node *Node;  
typedef struct _list *List;  

typedef struct _list { 
    Node head; 
} list; 

typedef struct _node { 
    int value; 
    Node next; 
} node; 

void listDeleteNth (List l, int n) { 
    Node current = l->head; 

    int i = 0; 
    while (i < n-1) { 
     current = current->next; //node before deleted node. 
    } 
    Node temp = current->next;  //make temp the one to be deleted. 

    if (current->next->next == NULL) { 
     printf("you deleted the last node!\n"); //check if dlting lastnode 
    } else { 
     current->next = current->next->next; //connect prev to after 
    } 
} 
+0

읽기 https://ericlippert.com/2014/03/05/how-to-debug 다음에

while (i < n-1) { current = current->next; //node before deleted node. } 

을 -small-programs/ –

+2

목록에 노드가 하나만 있다고 가정합니다. 그렇다면 이것은 실패 할 것입니다 (힌트 :'current-> next-> next'는'current-> next'가'NULL' 일 때 어떻게 작동 할 수 있습니까?) –

+0

당신은 코드에 몇가지 이슈가 있습니다.'i' 파라미터는 필요합니다 증가하는 경우 다음 네 가지 시나리오에 대해 생각해 볼 필요가 있습니다. 빈 목록, 1 노드 목록, 삭제할 노드가 마지막 노드, 삭제할 노드가 처음이 아니라 마지막 노드가됩니다 –

답변

0

먼저 in 어느 쪽의 루프 업데이트가 계속 이동하지 않게 다음 노드로 이동하여 세그멘테이션 오류로 끝납니다.

당신은 원래 루프 변경을 시도 할 수 있습니다 :

while (i < n-1) { 
    current = current->next; //node before deleted node. 
    i++; 
} 
+1

이것은 유일한 문제는 아닙니다. 그 코드 –

+0

그렇습니다. 주요 쟁점을 지적하는 동안 몇 가지 엣지 케이스도 고려해야합니다. – Jerry