2012-10-07 11 views
0

마지막 기능에서 삭제가 제대로 작동하지 않습니다. 그것은 노드가 삭제되었음을 보여 주지만 표시 할 때 무한 루프가되어 정크가 표시됩니다. 무엇이 잘못되었는지 알 수 없었습니다! 여기 링크 된 목록에서 노드 삭제

코드입니다 :

using namespace std; 
class List 
{ 
    struct NODE 
    { 
     int item; 
     NODE *next; 
    }; 
    NODE *Head,*Tail; 
    public: 
    List() 
    { 
     Head=NULL; 
     Tail=NULL; 
    } 
    ~List() 
    { 
     while(Head->next!=NULL) 
     { 
      Delete_At_Head(); 
     } 
     Delete_At_Head(); 
    } 
    void Add_At_First(int); 
    void Add_At_Last(int); 
    void Delete_At_Head(); 
    void Delete_At_Tail(); 
    int Is_Empty(); 
    void display(); 
}; 
void List::Add_At_First(int data) 
{ 
    NODE *temp; 
    temp=new NODE; 
    if(Head==NULL) 
    { 
     temp->item=data; 
     temp->next=NULL; 
     Head=temp; 
     Tail=Head; 
    } 
    else 
    { 
     temp->item=data; 
     temp->next=Head; 
     Head=temp; 
    } 
    cout<<"Node added at first!\n"; 
} 
void List::Add_At_Last(int data) 
{ 
    NODE *temp; 
    temp=new NODE; 
    temp->item=data; 
    temp->next=NULL; 
    if(Head==NULL) 
    { 
     Head=temp; 
     Tail=temp; 
    } 
    else 
    { 
     Tail->next=temp; 
     Tail=temp; 
    } 
    cout<<"Node added at last!\n"; 
} 
void List::Delete_At_Head() 
{ 
    NODE *temp; 
    temp=new NODE; 
    temp->item=Head->item; 
    temp->next=Head->next; 
    delete Head; 
    Head=temp->next; 
    delete temp; 
    cout<<"Node deleted from head!\n"; 
} 
void List::Delete_At_Tail()//Problematic part 
{ 
    NODE *temp,*prev; 
    temp=new NODE; 
    prev=new NODE; 
    temp=Head; 
    while(temp->next!=NULL) 
    { 
     prev=temp; 
     temp=temp->next; 
    } 
    prev->next=NULL; 
    delete temp; 
    delete Tail; 
    Tail=prev; 
    delete prev; 
    cout<<"Node deleted from tail!\n"; 
} 
int List::Is_Empty() 
{ 
    if(Head==NULL) 
     return 1; 
    else 
    return 0; 
} 
void List::display()//does not display after delete from tail 
{ 
    NODE *temp; 
    temp=new NODE; 
    temp->item=Head->item; 
    temp->next=Head->next; 
    do 
    { 
     cout<<temp->item<<"-->"; 
     temp=temp->next; 
    }while(temp->next!=NULL); 
    cout<<temp->item; 
} 
int main() 
{ 
    List obj; 
    int ch,data; 
    do 
    { 
     cout<<"\n1.Display\n2.Add at first\n3.Add at last\n4.Delete at 
head\n5.Delete at tail\n6.Exit\nEnter your choice: "; 
     cin>>ch; 
     switch(ch) 
     { 
      case 1: 
      { 
       if(obj.Is_Empty()) 
        cout<<"List is Empty!\n"; 
       else 
        obj.display(); 
       break; 
      } 
      case 2: 
      { 
       cout<<"Enter data: "; 
       cin>>data; 
       obj.Add_At_First(data); 
       break; 
      } 
      case 3: 
      { 
       cout<<"Enter data: "; 
       cin>>data; 
       obj.Add_At_Last(data); 
       break; 
      } 
      case 4: 
      { 
       if(obj.Is_Empty()) 
        cout<<"List is Empty!\n"; 
       else 
        obj.Delete_At_Head(); 
       break; 
      } 
      case 5: 
      { 
       if(obj.Is_Empty()) 
        cout<<"List is Empty!\n"; 
       else 
        obj.Delete_At_Tail(); 
       break; 
      } 
      case 6: 
      { 
       break; 
      } 
     } 
    }while(ch!=6); 
    return 0; 
} 
+1

것은 당신이 몇 가지 디버깅 기술을 습득하는 것이 좋습니다 코드 만 해당 조각 ... –

+1

을 게시 해보세요. 디버거를 사용하여 코드를 단계별로 실행하고 변수의 값을 보거나 "cin"문을 아낌없이 사용하여 값을 출력 할 수 있습니다. 이렇게하면 문제의 위치를 ​​추적하는 데 도움이됩니다. –

+0

죄송합니다 처음 게시했습니다. 그리고 내가 들여 쓰기 된 코드를 붙이면 모든 탭이 제거되었습니다. (문제는 분명히 delete_from_tail() 함수와 같습니다.) – user1727119

답변

0

하면 올바르게 목록의 마지막 항목을 삭제해야 다음

void List::Delete_At_Tail() 
{ 
    if(Head == NULL) return; 

    // If only one item in the list, delete it and empty the list... 
    if(Head->next == NULL) { 
     delete Head; 
     Head = NULL; 
     Tail = NULL; 
     return; 
    } 

    // Find the last item in the list 
    NODE *temp = Head; 
    while(temp->next!=Tail) 
    { 
     temp=temp->next; 
    } 

    delete Tail; 
    temp->next=NULL; 
    Tail=temp; 
    cout<<"Node deleted from tail!\n"; 
} 
+0

dmakaitis 감사합니다. 의미심장하다! :) – user1727119

+0

Dietmar가 말했듯이, 꼬리를 유지하는 이점을 활용하면 상황이 조금 더 단순 해집니다. –

0

당신은 확실히 너무 많은 개체를 삭제하여 Delete_At_Tail() (I이 당신이 "마지막에서 삭제"delete_from_tail()를 작성하거나 당신이 의미하는 기능입니다 가정, 정밀도를 프로그래밍하는 모든 경우 !) function : 하나의 객체를 없애고 싶지만, 삭제 된 객체의 전임자를 포함하여 세 개의 객체를 가지고 있습니다. 제거하려는 객체는 delete이어야하며 다른 객체는 없어야합니다. 그것 이외의 기능은 괜찮아 보인다.

현재까지 Tail에 대한 포인터를 유지 관리 중이므로 이전 노드를 찾는 방법을 향상시킬 수 있습니다. nextTail 인 노드를 찾을 수 있습니다. 이렇게하면 이전 변수를 찾는 루프에서 두 변수를 최신 상태로 유지해야하는 번거 로움을 피할 수 있습니다.

+0

... 고맙습니다. 그렇습니다. 정확한 것을 염두에 두십시오! :) – user1727119