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;
}
4

2 に答える 2

0

あなたは間違いなくあなたの中であまりにも多くのオブジェクトを削除していますDelete_At_Tail()(これはあなたが書いたときまたは「最後から削除する」ときに意図した関数だと思いますdelete_from_tail();プログラミングの精度がすべてであるとき!)関数:1つのオブジェクトを取り除きたいがあなたはdelete3つを使っています削除されたオブジェクトの先行オブジェクトを含むオブジェクト。delete削除するオブジェクトのみを使用し、他のオブジェクトは使用しないでください。それ以外は機能はOKに見えます。

ところで、あなたはへのポインタを維持しているので、あなたはTail前任者を見つける方法を改善することができます:あなたはであるノードを見つけることができnextますTail。これにより、ループ内で2つの変数を最新の状態に保ち、先行変数を探すという厄介な必要性を回避できます。

于 2012-10-07T18:55:34.597 に答える
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";
}
于 2012-10-07T18:59:30.537 に答える