Frage

Die jDeleteAfter Methode meiner verknüpften Liste Klasse soll den Knoten unmittelbar nach dem Knoten als Argument übergeben löschen. Wenn es das tut, weiß ich nicht, aber es wird abrupt schließt meine Konsolenanwendung, wenn „löschen tlp;“ (Temp Liste Pointer) wird gelesen. Mein Lehrer, die Benutzer eines Programmier Forum und ich habe noch die Wurzel dieses Problems zu ermitteln.

Written in Dev-C ++ 4.9.9.2:

[source]
#include "JawaListT.h"
#include <cstdlib>
#include <iostream>
#include <new.h>

/*DEFAULT CONSTRUCTOR*/
JawaListT::JawaListT()
{
    if((this->jHead = new (nothrow) JawaLinkT) && (this->jTail = new (nothrow) JawaLinkT))
    {
        this->jHead->jSetNext(this->jTail);
        this->jTail->jSetNext(this->jTail);
    }//end if allocated
}

/*INSERT NODE AFTER*/
void JawaListT::jInsertAfter(JawaLinkT* lp, int val)
{
    if(lp != NULL && lp != this->jTail)     //if passed not tail and not null
    {
        JawaLinkT* tlp;             //new list node

        if((tlp = new (nothrow) JawaLinkT) != NULL) //if dynamically allocated  
        {
            tlp->jSetNext(lp->jGetNext());  //temp.next = passed.next                   
            lp->jSetNext(tlp);      //passed.next = temp
            tlp->jSetValue(val);        //temp.data = val
        }//end if allocated
    }//end if not tail
}

/*INSERT NODE BEFORE*/
void JawaListT::jInsertBefore(JawaLinkT* lp, int val)
{
    if(lp != NULL && lp != this->jHead)     //if passed not head and not null
    {
        JawaLinkT* tlp;             //new list node

        if((tlp = new (nothrow) JawaLinkT) != NULL) //if dynamically allocated
        {
            tlp->jSetNext(lp->jGetNext());
            tlp->jSetValue(lp->jGetValue());
//          *tlp = *lp;         //copies passed node to temp node
            lp->jSetNext(tlp);      //passed.next = temp
            lp->jSetValue(val);     //passed.data = val
            if(lp == this->jTail)       //if passed is tail
            {
                this->jTail = tlp;  //tail is temp
                this->jTail->jSetNext(this->jTail); //tail.next = tail
            }//end if lp
        }//end if tlp
    }//end if head
}

/*REMOVE NODE AFTER*/
void JawaListT::jDeleteAfter(JawaLinkT* lp)
{
    if(lp != NULL && lp->jGetNext() != this->jTail) //if not tail and not null
    {
        JawaLinkT* tlp;             //temp pointer to node

        tlp = lp->jGetNext();           //temp = passed.next
        lp->jSetNext(tlp->jGetNext());      //passed.next = temp.next
        delete tlp;             //delete to what temp points
    }//end if next  

        /*code that did not work any better*/
//      tlp->jSetNext((lp->jGetNext())->jGetNext());    
//      delete lp->jGetNext();
//      lp->jSetNext(tlp);

/*Also tried declaring and/or deleting tlp outside of decision structure, and
jDeleteCurrent(tlp) since that function works properly.*/   
}

/*REMOVE CURRENT NODE*/
void JawaListT::jDeleteCurrent(JawaLinkT* lp)
{
    if(lp != NULL && lp != jHead && lp != jTail)    //if not head or tail, not null
    {   
        JawaLinkT* tlp;             //temp pointer to node

        tlp = lp->jGetNext();           //temp = passed.next
        *lp = *tlp;             //copy temp to passed
        if(tlp == jTail)            //if temp is tail
        {
            this->jSetTail(lp);     //tail = passed
            lp->jSetNext(lp);       //passed.next = passed
        delete tlp;             //delete to what temp points
        }//end if tail
    }//end if not head
}

/*LINEAR SENTINEL SEARCH*/
JawaLinkT* JawaListT::jFindItemS(int item)
{
    JawaLinkT* tlp;                 //temp pointer to node
this->jTail->jSetValue(item);               //tail.data = item

    for(tlp = jHead->jGetNext(); tlp->jGetValue() != item; tlp = tlp->jGetNext());
    /*INIT: node after head, EXIT: data found, UPDATE: increment node*/

    if(tlp == jTail)                //if sentinel found
            std::cout << item << " not in list" << std::endl;   

    return((tlp != this->jTail->jGetNext()) ? tlp : NULL);
    /*If sentinel not found, return proper node, else return null*/
}

[/source]

Ich verwende die Klasse Sentinel-Suche die Liste und geben Sie den richtigen Knoten als Argument für jDeleteAfter zu durchqueren.

Keine korrekte Lösung

Andere Tipps

Ein einfacher Hinweis: Entfernen Sie alle Tests für Zuordnungsfehler - sie werden nie auf einer Windows-Plattform passieren amd den Code erschweren. Und wenn sie passieren, Sie erholen sich nicht von ihnen, so dass die Tests doppelt nutzlos sind.

Es stellt sich heraus es ein Konflikt mit meiner delete-Anweisung in meinem virtuellen destructor war. Alles funktioniert jetzt. Vielen Dank für die Look-over meines Codes.

Wie bei der nothrows - ich es so machen, weil unser Text die Idee eingeführt und ich weiß nicht, wie Ausnahmen noch zu handhaben. Vielen Dank für die Beratung aber nicht.

Einige Code-Review-Tipps:

JawaLinkT* tlp;                         //new list node

if((tlp = new (nothrow) JawaLinkT) != NULL)

ist besser lesbar als:

if(JawaLinkT* tlp = new (nothrow) JawaLinkT)

(auch findet Neil Kommentar oben, warum mit nothrow ohne tatsächlich etwas dagegen zu tun)

Der Code auch mit zufälligen potenziellen Speicherlecks übersät ist:

if((this->jHead = new (nothrow) JawaLinkT) && (this->jTail = new (nothrow) JawaLinkT))
// What if first new succeeds and second fails?

In Bezug auf die Frage, das ist eine Menge Code, ohne so viel wie Stack-Trace lesen nur für einen generischen Fehler zu suchen, aber ich denke, jDeleteAfter falsch implementiert werden kann. Betrachten wir den Fall, wenn die Funktion den Knoten vor dem Schwanz übergeben wird. Ich werde es dort abgeschnitten, weil es wie Hausaufgaben sieht; aber wenn Sie immer noch Probleme haben, Stellung zu nehmen und ich werde klären.

EDIT: Und ich merkte, ich war falsch. Vergiss es!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top