2016-12-25 2 views
2

나는 다음과 같은 링크리스트의 구현이이 같은 [First]->[Second]->NULL두 인덱스간에 연결된 목록의 노드를 삭제하는 방법은 무엇입니까?

:이 연결리스트에이 기능을 실행 //

void deleteList(struct _list *list, int from, int to) { 
    int i; 

    assert(list != NULL); 

    // I skipped error checking for out of range parameters for brevity of code 

    for (i = from; i <= to; i++) { 
     deleteNode(list->head, i); 
    } 
} 

:

struct _node { 
    char *string; 
    struct _node *next; 
} 

struct _list { 
    struct _node *head; 
    struct _node *tail; 
} 

나는 다음과 같은 기능을 만들고 싶어를 deleteNodes(list, 1, 1) 두 번째 줄을 지우고 [First]->[Second]->NULL을 입력했지만이 입력을 사용하여 deleteList(list, 0, 1)과 같이 실행하면 [First]->[Second]->[Third]->NULL 나는 seg 결함을 얻는다. 여기

가 나는 경우 나 = 0에 연결리스트의 머리를 삭제하기 위해 별도의 기능을 썼다

void deleteNode(struct _node *head, int index) { 
    if (head == NULL) { 
     return; 
    } 

    int i; 
    struct _node *temp = head; 

    if (index == 0) { 
     if (head->next == NULL) { 
      return; 
     } 
     else { 
      head = head->next; 
      free(head); 
      return; 
     } 
    } 

    for (i = 0; temp!=NULL && i<index-1; i++) { 
     temp = temp->next; 
    } 

    if (temp == NULL || temp->next == NULL) { 
     return; 
    } 

    Link next = temp->next->next; 

    free(temp->next); 

    temp->next = next; 
} 

내 deleteNode 기능입니다 :

void pop(struct _node *head) { 
    if (head == NULL) { 
     return; 
    } 

    struct _node *temp = head; 
    head = head->next; 
    free(temp); 
} 

을하지만 그것은 나를 독방 감금 잘못 제공 또는 메모리 오류 트랩을 중단하십시오. 6.

+0

루프 어디를 'deleteNode' 호출은 결함이 있습니다 : 범위에서 첫 번째 노드를 삭제하면 삭제할 다음 노드는 이전과 같은 색인을 가지지 않습니다. –

+0

물론! 그래서 새로운 머리를 가리 키도록해야합니까? 아니면 완전히 다른 접근 방식을 사용해야합니까? – user6005857

+0

간단한 해결책은 루프를 뒤집고 범위의 마지막 노드를 삭제 한 다음 마지막 순서대로 삭제하는 것입니다. –

답변

1

목적으로 노드 하나만 사용하는 것이 좋습니다. struct.

struct node { 
    char *string; 
    struct node *next; 
}; 

그런 다음 목록의 변화의 길이에 따라 인덱스를 조정하지 않을 경우 권리 요소를 삭제하지 않습니다 개의 인덱스 간의 요소를 제거하기위한 루프. 그리고 당신은 또한 목록의 새로운 머리를 반환해야합니다.

struct node *deleteList(struct node *head, unsigned from, unsigned to) { 
    unsigned i; 
    unsigned count = 0; 
    for (i = from; i <= to; i++) { 
     head = delete_at_index(head, i - count); 
     count++; 
    } 
    return head; 
} 

도움말 기능 delete_at_index은 다음과 같습니다.

struct node *delete_at_index(struct node *head, unsigned i) { 
    struct node *next; 

    if (head == NULL) 
     return head; 

    next = head->next; 

    return i == 0 
      ? (free(head), next)         /* If i == 0, the first element needs to die. Do it. */ 
      : (head->next = delete_at_index(next, i - 
               1), head); /* If it isn't the first element, we recursively check the rest. */ 
} 

아래 프로그램을 완료하십시오.

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

struct node { 
    char *string; 
    struct node *next; 
}; 

void freeList(struct node *head) { 
    struct node *tmp; 

    while (head != NULL) { 
     tmp = head; 
     head = head->next; 
     free(tmp->string); 
     free(tmp); 
    } 

} 

struct node *delete_at_index(struct node *head, unsigned i) { 
    struct node *next; 

    if (head == NULL) 
     return head; 

    next = head->next; 

    return i == 0 
      ? (free(head), next)         /* If i == 0, the first element needs to die. Do it. */ 
      : (head->next = delete_at_index(next, i - 
               1), head); /* If it isn't the first element, we recursively check the rest. */ 
} 

struct node *deleteList(struct node *head, unsigned from, unsigned to) { 
    unsigned i; 
    unsigned count = 0; 
    for (i = from; i <= to; i++) { 
     head = delete_at_index(head, i - count); 
     count++; 
    } 
    return head; 
} 

void pushvar1(struct node **head_ref, char *new_data) { 
    struct node *new_node = malloc(sizeof(struct node)); 
    new_node->string = strdup(new_data); 
    new_node->next = (*head_ref); 
    (*head_ref) = new_node; 
} 

void printListvar1(struct node *node) { 
    while (node != NULL) { 
     printf(" %s ", node->string); 
     node = node->next; 
    } 
    printf("\n"); 
} 

int main(int argc, char **argv) { 
    struct node *head = NULL; 
    for (int i = 0; i < 5; i++) { 
     char str[2]; 
     sprintf(str, "node%d", i); 
     pushvar1(&head, str); 
    } 

    puts("Created Linked List: "); 
    printListvar1(head); 
    head = deleteList(head, 0, 2); 
    puts("Linked list after deleted nodes from index 0 to index 2: "); 
    printListvar1(head); 
    freeList(head); 
    return 0; 
} 

모든 프로그래밍 문제는 간접 더 높은 수준의 추가에 의해 해결 될 수

Created Linked List: 
node4 node3 node2 node1 node0 
Linked list after deleted nodes from index 0 to index 2: 
node1 node0 
+0

? : delete_at_index 함수에서 의미? – user6005857

+0

@ user6005857'delete_at_index function'은 하나의 nore를 지우는 도우미 함수입니다. –

+0

그 점을 이해합니다. 나는 물음표 콜론 구문과 혼동을 일으켰다. 그러나 나는 그것을 알아 냈다. – user6005857

1

테스트 : 포인터에 대한 포인터를 사용을 ...


unsigned deletefromto(struct node **head, unsigned from, unsigned to) 
{ 
unsigned pos,ret; 
struct node *this; 

for (pos=ret=0; this = *head;pos++) { 
     if (pos < from) { head = &(*head)->next; continue; } 
     if (pos > to) break; 
     *head = this->next; 
     free(this); 
     ret++; 
     } 
return ret; /* nuber of deleted nodes */ 
} 
관련 문제