2016-07-29 3 views
1

단일 링크 된 목록과 위치가 주어지면 특정 위치에서 연결된 목록 노드를 삭제하려고합니다. CODE : 나는이 위치 0 위의 노드를 삭제하려고 할 때마다링크 된 목록의 주어진 위치에서 노드 삭제

#include<stdio.h> 
#include<stdlib.h> 

struct node 
{ 
    int data; 
    struct node* next; 
}; 

void printList(struct node* head_ref) 
{ 
    //struct node* head_ref = (struct node*)malloc(sizeof(struct node)); 

    if(head_ref == NULL) 
    printf("The list is empty"); 

    while(head_ref!=NULL) 
    { 
     printf("%d\n",head_ref->data); 
     head_ref = head_ref->next; 
    } 
} 

void insert_beg(struct node **head_ref,int new_data) 
{ 
    struct node* new_node = (struct node*)malloc(sizeof(struct node)); 
    new_node->data = new_data; 
    new_node->next = *head_ref; 
    *head_ref = new_node; 
} 

void delete(struct node **head_ref,int position) 
{ 
    int i=1; 
    if(*head_ref == NULL) 
    return; 

    struct node *tails,*temp = *head_ref; 
    if(position == 0) 
    { 

     *head_ref = temp->next; 
     free(temp); 
     return; 
    } 

    while(temp->next!=NULL) 
    { 
     tails = temp->next; 
     temp = temp->next; 

     if(i == position) 
     { 
      tails->next = temp->next; 
      free(temp); 
      return;  
     } 

     i++; 
    } 

} 

int main() 
{ 
    struct node *head = NULL; 
    insert_beg(&head,36); 
    insert_beg(&head,35); 
    insert_beg(&head,34); 
    insert_beg(&head,33); 

    printList(head); 
    int position; 
    printf("Enter the position of the node u wanna delete\n"); 
    scanf("%d",&position); 

    delete(&head,position); 
    printf("\n"); 
    printList(head); 
} 

, 내가 대신 아무것도의 특정 위치에 0을 얻고있다. 내가 어디로 잘못 가고 있는지 알 수 있을까? 예를 들어, 내 목록 입니다 : 33 34 35 36 내 출력 : 33 0 35 36 유효한 출력 (노드 1을 삭제하는 동안) : 앞으로 당신의 삭제 기능 while 루프 tailstemp 이동 33 35 36

답변

0

문제가 발생합니다 같은 노드입니다. 임시가 삭제되면 삭제 된 노드 옆에있는 데이터 구성원을 temp-> 다음으로 설정합니다.

if(i == position) 
    { 
     tails->next = temp->next; 
     ^^^^^^^^^^^^^^^^^^^^^^^^^ 

여기서 꼬리는 삭제 될 노드입니다.

삭제 된 노드 이전의 노드 옆에서 데이터 멤버를 변경해야합니다. 그래서 잘못된 문은 내가 기능을 다음과 같은 방법

int delete(struct node **head, size_t position) 
{ 
    struct node *prev = NULL; 

    size_t i = 0; 

    while (i != position && *head != NULL) 
    { 
     prev = *head; 
     head = &(*head)->next; 
     ++i; 
    } 

    int success = *head != NULL; 

    if (success) 
    { 
     struct node *tmp = *head; 

     if (prev == NULL) 
     { 
      *head = (*head)->next; 
     } 
     else 
     { 
      prev->next = (*head)->next; 
     } 

     free(tmp); 
    } 

    return success; 
} 
를 작성합니다 나를 위해로서

while(temp->next!=NULL) 
{ 
    tails = temp; 
    ^^^^^^^^^^^^^ 
    temp = temp->next; 

처럼 업데이트해야합니다

0

을 같은 시간에 같은 주소에서 시작합니다. 동일한 값을 항상 지정하기 때문에 노드가 삭제되지 않습니다. 즉, 매번 다음 포인터 값만 확인합니다.

즉, 취소 한 후에 노드 중 하나의 free 개의 메모리로 인해 인쇄물이 UB라는 뜻입니다.

코드 수정 :이 때문에 잘못된 문이 경우 꼬리에

while(temp->next!=NULL) 
{ 
    tails = temp->next; 
    ^^^^^^^^^^^^^^^^^^^ 
    temp = temp->next; 

및 온도에

void delete(struct node **head_ref,int position) 
{ 
    int i=1; 
    if(*head_ref == NULL) 
    return; 

    struct node *temp = *head_ref; 
    if(position == 0) 
    { 
     *head_ref = temp->next; 
     free(temp); 
     return; 
    } 

    struct node *tails = *head_ref; 

    while(temp->next!=NULL) 
    { 
     temp = temp->next; 

     if(i == position) 
     { 
      tails->next = temp->next; 
      free(temp); 
      return; 
     } 

     tails = tails->next; 

     i++; 
    }  
} 
관련 문제