1

私はすでに単一リンクの巡回リストを作成しましたが、これは正常に機能しましたが、この場合、テールを削除したい場合、ノードがテールとして挿入された場合にテールを削除するという問題が発生していますが、うまくいきません 'ヘッドとして挿入された場合。問題はinserthead-inserttail接続またはdelete tail機能にあると思いますが、見つかりません。私はあなたの助けに感謝します。

構造:

struct Element{
int value;
Element *prev, *next;

};

struct List2W{
    Element *tail;
};

コード:

void insertHead(List2W& l, int x){

Element *new_head = new Element;
new_head->value=x;

if(isEmpty(l))
{
    new_head->next=new_head;
    new_head->prev=new_head;
    l.tail=new_head;
}
else
{
    new_head->next=l.tail->next;
    new_head->prev=l.tail;
    l.tail->next=new_head;
}

}

void insertTail(List2W& l, int x){

Element *new_tail = new Element;
new_tail->value=x;

if(isEmpty(l))
{
    new_tail->next=new_tail;
    new_tail->prev=new_tail;
}
else
{
    new_tail->next=l.tail->next;
    new_tail->prev=l.tail;
    l.tail->next=new_tail;
}
l.tail=new_tail;

}

bool deleteTail(List2W& l, int &value){

if(isEmpty(l))
    return false;

else if(l.tail->next==l.tail)
    {
        value=l.tail->value;
        l.tail=NULL;
    }

else
{
    value=l.tail->value;
    (l.tail->prev)->next=l.tail->next;
    (l.tail->next)->prev=l.tail->prev;
    l.tail=l.tail->prev;
}
return true;}
4

2 に答える 2

0

さて、私のinserthead関数には行がありませんでした.headの前のものをnew_headに接続する必要があります:

 else
    {
        (l.tail->next)->prev=new_head; // here
        new_head->next=l.tail->next;
        new_head->prev=l.tail;
        l.tail->next=new_head;
    }

@nariuji さん、その機能を再分析させていただき、ありがとうございます。それ以外は、実際にテールを削除してメモリを解放するだけで十分です。

于 2016-03-19T15:07:58.520 に答える