2017-01-16 1 views
2
#include<stdio.h> 
#include<stdlib.h> 

typedef struct dlist 
{ 
    int data; 
     struct dlist *next, *prev; 
}dlist; 

dlist* insert_begin(dlist *h,int d) 
{ 
    dlist *temp = (dlist*)malloc(sizeof(dlist)); 
    temp->data = d; 
    temp->next = temp->prev= NULL; 
    if(h==NULL) 
    { 
     h=temp; 
     // t=temp; 
    } 
    else 
    { 
     temp->next = h; 
     h->prev = temp; 
     h = temp; 
    } 
    return h; 
} 
dlist* delete_begin(dlist *h) 
{ 
    dlist *r = h; 
    if(r==NULL) 
    { 
     printf("empty list"); 
     return 0; 
    } 
    else 
    { 
     dlist *ptr = r; 
     //ptr = r; 
     r=r->next; 
     r->prev = NULL; 
     free(ptr); 
    } 
    return r; 
} 
dlist* delete_end(dlist *h) 
{ 
    dlist *r = h; 
    if(r==NULL) 
    { 
     printf("empty list"); 
     return 0; 
    } 
    else 
    { 
     while(r->next) 
      r=r->next; 

     dlist *p = r; 
     (r->prev)->next= NULL; 
     free(p); 
     return r; 
    } 

    //return r; 
} 
void display(dlist *h) 
{ 
    dlist *r = h; 
    // printf("%d",r->data); 

    //printf("ajay"); 
    while(r) 
    { 
     printf("%d ---- >",r->data); 

     r=r->next; 
    } 
} 
void main() 
{ 
    dlist *d=NULL; 

    d = insert_begin(d,2); 
    d= insert_begin(d,3); 
    d= insert_begin(d,4); 
    d= insert_begin(d,5); 
    display(d); 
    d = delete_begin(d); 
    printf("After deletion1"); 
    display(d); 
    d= delete_end(d); 
    printf("After deletion2"); 
    display(d);        // infinite elements are displaying on screen 

} 

위의 코드는 이중 링크 목록에서 요소를 삽입하고 삭제하기 위해 쓰는 코드입니다. 제 부분을 삽입하고 처음부터 노드를 삭제하면 둘 다 잘 작동합니다. delete_end() 함수에서 문제가 발생했습니다. 코드를 컴파일하고 실행하면 계속해서 화면에 인쇄됩니다. 도움이 필요하다.이중 링크 목록에서 요소 삽입 및 제거

+0

귀하의 delete_end() 함수를 제안 할 수 있습니다. 당신은'h','r','p'를 모두 가지고 같은 것을 가리 킵니다. 'p'를 만들고 아무것도하지 않고'free()'합니다. – mhodges

답변

3

delete_end()에서 코드는 1 개 노드 목록의 경우, r != NULL하지만 r->prev == NULLr->next == NULL을 처리하지 않습니다. 코드에서 (r->prev)->next = NULL을 시도하면 문제가 발생합니다.

delete_begin() 노드 목록도 하나도 처리하지 않습니다. r=r->nextr == NULL을, 그 다음에 r->prev == NULL을 설정할 수 있습니다.

delete_end()으로 돌아 가면 h이 아니고 r이 아닌 코드가 반환되어야합니다.

+0

확인. 그 한 경우, 당신은 내게 통지를 가져다 ...하지만 난 4 노드를 삽입 한 다음 하나를 삭제하려고합니다. 그래서 1 노드 목록 사건은 아직 발생하지 않았다. –

+0

@AjayKhetan - 목록이 비어 있지 않으면 delete_end()가 h를 반환 할 필요가 있지만 대신 r을 반환합니다. – rcgldr

+0

고맙습니다. 1 개의 노드리스트 케이스가 문제입니다. 이와 함께, 나는 첫 번째 노드의 주소를 반환해야하고 마지막 노드의 주소를 반환합니다. 알았다. –

0

기능에 심각한 문제가 두 개 이상 있습니다.

이 때문에이 목록의 헤드 노드를 가리키는 포인터를 반환해야하지만 루프

while(r->next) 
    r=r->next; 

에 헤드 노드의 주소 불평등 될 수있는 포인터 r를 반환 모든

우선 .

또한 포인터 r이 헤드 노드를 가리키는 경우 r->prevNULL과 같습니다. 따라서이 문장은 프로그램의 동작이 정의되지 않은 상태가 될 수 있습니다.

(r->prev)->next= NULL; 

나는 다음과 같은 기능 구현을 정말 이해가되지 않습니다

dlist* delete_end(dlist *h) 
{ 
    if(h == NULL) 
    { 
     printf("empty list"); 
    } 
    else 
    { 
     dlist **r = &h; 

     while ((*r)->next) r = &(*r)->next; 

     dlist *p = *r; 

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

     *r = (*r)->prev; 

     free(p); 
    } 

    return h; 
}