Erstellen einer Matrix *schäm*



  • Hallo miteinander
    ich hab folgendes Problem:

    Ich bräuchte ein Matrix in C, welche structs (hat einen Typ char 'Name' und einen Zeiger '*next') enthält die wiederum auf eine Doppeltverkettete Liste zeigen!!!
    Ich bastle schon seit 3 Tagen daran herum und hab schon paar Lektüren zu mir genommen 😉 bin aber zu dumm um die "doppel-Referenzierung" zu verstehen.

    Kann mir da bitte jemand helfen???

    Vielen vielen Dank schon mal im Voraus!!!



  • Hi!

    Du brauchst für eine Doppelt Verkettete Liste immerhin schon
    zwei Zeiger also nicht nur *next sondern auch *prev, für die Rückwärts-
    verkettung.

    Ich würde die Struct so deklarieren:

    struct Daten
    {
    char name;
    };
    typedef struct Daten DATEN;

    struct Knoten
    {
    DATEN *daten;
    struct Knoten *next;
    struct Knoten *prev;
    };
    typedef struct Knoten KNOTEN;



  • Original erstellt von <Danny>:
    **
    struct Daten
    {
    char name;
    };
    typedef struct Daten DATEN;
    **

    kann man der einfachheithalber in einer Anweisung zusammenfassen:

    typedef struct _tagDATEN
    {
      char name;
    } DATEN;
    


  • und wie verbinde ich sie zu einer Matrix zusammen ????



  • hmm... das mim next kapier i no ned so ganz was du meinst.

    -> hast du eine liste oder hast du zwei listen? Was ist die Aufgabenstellung, vielleicht hilft mir das beim Verstehen des Problems.

    Doppelrefferenzierung is ned schwer. Ist im prinzip ein pointer auf einen pointer könnte man sagen... dH wenn man einen pointer auf einen pointer übergeben hat, muss man doppelt dereferenzieren um wieder auf die daten zu kommen...

    typedef struct _daten {
      char name[20];
      _daten *next;
    } daten;
    

    im main

    struct daten *ptr = malloc (sizeof (daten));
    //jetzt haben wir einen pointer auf eine daten-struktur, um auf die struktur selbst zu kommen müssen wir dereferenzieren ->
    ptr->next = 0;
    //nun, hier siehst du keine dereferenzierung auf den ersten blick. das ist weil der -> automatisch dereferenziert... wenn du den . statt dem -> verwendest, müsstest du dies manuell tun
    //würde dann so aussehen:
    //(*ptr).next = 0;
    // dH der * wird zum dereferenzieren verwendet...
    
    //Nun erstelle ich einen pointer auf einen pointer...
    struct daten **ptr2 = &ptr1;
    
    //Wie unschwer zu erkennen ist zeigt ptr2 nun auf die Adresse von ptr1, und müsste doppelt dereferenziert werden um auf die Daten zu kommen ->
    (*ptr2)->next = 0
    (**ptr2).next = 0
    //wieder sind die oberen zeilen ein und das selbe... nur andere schreibweise...
    

    Nun, das ganze in ne Matrix zu packen sollte nicht all zu schwer sein, wieso auch... erstell dir ne Matrix aus pointern (in dem falle) daten pointern, welche einfach auf die strukturen zeigen...

    pass auf mit dem speicher, man verliert schnell nen pointer...

    bei fragen -> ICQ# 123305354

    oder drunter, wie oft ich hier reinschau is ne andere sache 😉

    STi



  • Ich denke du meinst sowas:

    typedef struct _Data
    {
        char name[];
        //.. mehr daten...
        struct *_data next;
        struct *_data prev;
    }Daten;
    
    //globales Feld von Daten
    Daten *feld[ANZ]; // Anz ist mit define zu definieren; alternativ:
              // Daten **feld; hier groesse mit malloc bestimmen
              // z.B.: feld=(feld **)malloc(sizeof(*Daten) *42);
              // feld ist nun ein Zeiger auf 42 Zeiger des typs Daten
    
    Daten *liste_eins_Kopf;
    Daten *liste_zwei_Kopf;
    
    int main()
    {
    
    //...
        liste_eins_Kopf=erzeugeListe();
        liste_zwei_Kopf=erzeugeListe();
        feld[0]=liste_eins_Kopf;
        feld[1]=liste_zwei_Kopf;
    //...
        return 0;
    }
    

    Achtung: nicht getestet!

    edit: Hey, warum gibt es kein C- Code tag, sondern nur ein für C++. 😉

    [ Dieser Beitrag wurde am 04.02.2003 um 14:25 Uhr von xroads42 editiert. ]

    [ Dieser Beitrag wurde am 04.02.2003 um 14:25 Uhr von xroads42 editiert. ]



  • Jo, damit wäre auch klar wozu er doppelt dereferenzieren / referenzieren müsste...

    indem das array kein "pointer-kopie" array ist (sozusagen zeigen keine zwei pointer auf die selbe adresse), sondern weil in der lekütre w*****einlich ein pointer auf nen pointer gemacht wrude..

    STi

    PS: gibt w*****einlich nur nen C++-Codetag weils sowieso die selbe syntax hat und C++ nur a "bissi" erweitert wurde.. schade eigentlich, würd sich nett machen so n C-Codetag wo er class als schlüsselwort ned kennt *hrhr*



  • @ all
    Vielen vielen Dank habt mir echt weitergeholfen!!!
    Hab es endlich nach 2 Tagen ufff kapiert *freu*
    Freu mich suuupppeeerrr das ich so ein Forum gefunden habe !!!
    Nochmals vielen vielen Dank!!! 🙂


Anmelden zum Antworten