Zeigerverwirrung und Funktionen

Hallo Forum!

Ich habe mal eine wohl relativ einfache Frage, aber mich trotzdem verzettelt :wink:

Also ich möchte eine Funktion schreiben, der ein Knoten einer DL-Liste übergeben wird, diesen ‚aushängt‘ und in irgend einer Weise den Knoten vor dem gelöschten zurückgibt - und lezteres ist das Problem.

Probiert habe ich:

void f (structNode *pNode)
{
/* static oder nicht static ist wohl nicht
das Thema hier */
structNode *pNodeTemp = pNode->pPrev;

/* […] un-linken […] */

pNode = pNodeTemp;
}

oder:
structNode *f(structNode *pNode)
{
structNode *pNodeTemp = pNode->pPrev;

/* […] */
return pNodeTemp;
}

In beiden Fällen macht mir die lokale temporäre Variable Bauchweh, obwohl die Liste an sich global ist und desshalb der zurückgegebene (?!) Wert wohl gültig sein wird.

Wie mache ich das also richtig (also ANSI :wink:? Etwa mit einem Zeiger-auf-ein-Zeiger und Call-By-Reference ?!

Gruß,
Jo

In beiden Fällen macht mir die lokale temporäre Variable
Bauchweh, obwohl die Liste an sich global ist und desshalb der
zurückgegebene (?!) Wert wohl gültig sein wird.

In der lokalen Variable speicherst du nur die Speicheradresse an der das Element liegt, das eigentliche Element ist vom Scope des Pointers nicht betroffen.

Bei der Rückgabe wird zwar der Pointer gelöscht und sein Inhalt in den Pointer kopiert dem du das Ergebnis der Methode zuweist, aber wie gesagt, hat keinen Einfluss auf das eigentliche Element.

Deswegen sehe ich eigentlich kein Problem darin wie du es machst, ich würds genauso machen. :smile:

Grüße, Robert

Also ich möchte eine Funktion schreiben, der ein Knoten einer
DL-Liste übergeben wird, diesen ‚aushängt‘ und in irgend einer
Weise den Knoten vor dem gelöschten zurückgibt - und lezteres
ist das Problem.

Wenn nur der auszuhängende Knoten bekannt ist, sollte die
Liste am besten doppelt-verlinkt sein und der ListenKopf
sollte ein dummy-structNode sein.

structNode\* DeleteAndWalkBack(structNode \*pNode) {
 structNode \*result = pNode-\>pPrev;

 pNode-\>pPrev-\>pNext = pNode-\>pNext;
 pNode-\>pNext-\>pPrev = pNode-\>pPrev;

 pNode-\>pPrev = pNode-\>pNext = NULL;


 return result;
}

Hast du nur eine einfache Verkettung (mit NULL als Ende),
muß die Funktion den ListenKopf kennen:

structNode\* DeleteAndWalkBack(structNode \*pNode) {
 structNode\*\* ppTemp;
 for (ppTemp = &Listenkopf; \*ppTemp; ppTemp=&(\*ppTemp)-\>pPrev) {
 if (\*ppTemp == pNode) {
 \*ppTemp = pNode-\>pPrev;
 pNode-\>pPrev = NULL; // sicherheitshalber
 return \*ppTemp;
 }
 }
 // Fehler: pNode liegt gar nicht in der Liste!
 return NULL; // oder was besseres??
}