Forum: PC-Programmierung liste c adreese vom vorigen knoten problem


von Dominik (Gast)


Lesenswert?

einen schönen guten abend,

ich habe eine funktion, die einen knoten in einer Liste hinzufügt
1
static void appendNode(node** liste, uint8_t data_u16)
2
{
3
    node* newNode = NULL;
4
    node* temp = NULL;
5
    uint8_t counter_u8 = 0;
6
7
    while(*liste != NULL)
8
    {
9
        counter_u8++;
10
        liste = &(*liste)->next;
11
    }
12
    newNode = malloc(sizeof(*newNode));
13
    if(NULL != newNode)
14
    {
15
        newNode->number_u16 = counter_u8;
16
        newNode->data_u16 = data_u16;
17
        newNode->next = NULL;
18
    }
19
20
    *liste = newNode;
21
}

die Struktur node soll jetzt ein zusätzliches Element bekommen. Neben 
dem next (welches auf den nächsten Knoten zeigt), möchte ich ein prev 
hinzufügen, welches auf den vorigen knoten zeigt.

Aber ist das ohne größeren Umbau dieser funktion überhaupt möglich?
Beim debuggen sehe ich am Anfnagn die Elemente vom ersten Knoten. Nach 
der while-schleife ist das element schon der neue Knoten. Das heißt an 
den vorigen knoten komme ich gar nicht mehr ran?

von Nop (Gast)


Lesenswert?

Das entscheidende Stichwort, das Du in der Vorlesung offenbar nicht 
mitbekommen hast, lautet "doppelt verkettete Liste" bzw. "doubly linked 
list". Damit solltest Du Deine Hausaufgaben jetzt selber machen können, 
mit etwas nachsehen in Deinen Unterlagen bzw. bei Google.

von Vincent (Gast)


Lesenswert?

1
static void appendNode(node** liste, uint8_t data_u16)
2
{
3
    node* newNode = NULL;
4
    node* temp = NULL;
5
    uint8_t counter_u8 = 0;
6
    while(*liste != NULL)
7
    {
8
        if(*&(*liste)->next == NULL)
9
        {
10
          /* hier ist der letzte knoten bevor die while verlassen wird */
11
        }
12
        counter_u8++;
13
        liste = &(*liste)->next;
14
    }
15
    ... ... ...
16
    ... ... ...
17
}

Jetzt noch ein bisschen Pointer lernen und verstehen was da passiert, 
dann dürfte das auch kein Problem mehr sein.

von PittyJ (Gast)


Lesenswert?

Nur mal so aus Interesse

Warum nennt man eine Variable, die 8 Bit breit ist, data_u16?
Also das hier:

uint8_t data_u16

Das führt doch nur zu Problemen, weil man evtl davon ausgeht, dass in 
data_u16 auch 16 Bit breite Werte gespeichert werden können?

Oder hat das einen Sinn?

von Εrnst B. (ernst)


Lesenswert?

Nop schrieb:
> Damit solltest Du Deine Hausaufgaben jetzt selber machen können,

Wenn du Bonus-Punkte beim Lehrer einsammeln willst:

https://en.wikipedia.org/wiki/XOR_linked_list

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.