kostenloser Webspace werbefrei: lima-city


Einfach vertrackte Liste

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    In folgender einfach verketteten Liste muss ein (vertrackter) Fehler sein. Ich weiß nur leider nicht, wo...
    Ich kann mich heute damit nicht mehr beschäftigen, also gebe das Vergnügen mal an euch weiter!

    EDIT: OK, beachtet am Besten nur die zweite Variante. Außerdem arbeiten beide nach dem LIFO-Prinzip.

    typedef struct skette {
        char *zeile;
        struct skette *weiter;
    } kette;
    int anz_kette;
    kette test;
    void initkette() {
        anz_kette = sizeof(kette);
        test.zeile = NULL;
        test.weiter = NULL;
    }
    void merken(char* z, kette *anker) {
        kette *kopf = anker;
        while (kopf->weiter != NULL) kopf = kopf->weiter;
        if (kopf != anker) {
            kopf->weiter = malloc(anz_kette);
            kopf = kopf->weiter;
            kopf->weiter = NULL;
        }
        kopf->zeile = z;
    }
    char* erinnern(kette *anker) {
        kette *kopf = anker;
        kette *hals = NULL;
        while (kopf->weiter != NULL) {
            hals = kopf;
            kopf = kopf->weiter;
        }
        char* z = kopf->zeile;
        if (kopf != anker) {
            free(kopf);
            hals->weiter = NULL;
        } else kopf->zeile = NULL;
        return z;
    }

    Funktionsweise:
    Es werden hier Zeilen in einer "kette" genannten Liste (rückwärts) gespeichert oder ausgelesen. Leider scheint es, als ob immer nur ein Element der Liste bestünde (also der Nachfolger des Ankers ist immer NULL) und auch die gespeicherte Zeile beinhaltet nicht das, was sie sollte...


    2. Variante (vorwärts):
    void merken(char *z, kette *anker) {
        kette *rumpf = anker->weiter;
        anker->weiter = malloc(anz_kette);
        kette *kopf = anker->weiter;
        kopf->weiter = rumpf;
        kopf->zeile = z;
    }
    char *erinnern(kette *anker) {
        if (anker->weiter != NULL) {
            kette *rumpf = anker->weiter;
            char *z = rumpf->zeile;
            anker->weiter = rumpf->weiter;
            free(rumpf);
            return z;
        } else return "";
    }

    Hier stimmt anscheinend nur der Inhalt der Elemente nicht - Die Liste hat schonmal die richtige Anzahl an Elementen.

    Vielen Dank im Vorraus und frohe Weihnachten!

    Beitrag zuletzt geändert: 24.12.2012 11:36:51 von toolz
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo toolz,

    Du solltest lieber zwischen den Ketten-Elementen und dem Kontainer unterscheiden, dann wird die Sache wesentlich einfacher:
    #include <stdio.h>
    #include <stdlib.h>
    
    /* Elemente der Kette */
    typedef struct ketten_element_
    {
      struct ketten_element_ * weiter;
      char * zeile;
    } ketten_element_t;
    
    /* Kontainer für Kettenelemente */
    typedef struct kette_
    {
      ketten_element_t * kopf;
      long anzahl;
    } kette_t;
    
    void kette_init(kette_t * kette) {
        kette->kopf = NULL;
      kette->anzahl = 0;
    }
    
    void kette_merken(char *z, kette_t * kette) {
      ketten_element_t * neu;
    
      neu = (ketten_element_t*)malloc(sizeof(ketten_element_t));
      neu->weiter = kette->kopf;
      neu->zeile = z;
    
      kette->kopf = neu;
      kette->anzahl++;
    }
    
    char * kette_erinnern(kette_t * kette) {
      ketten_element_t * alt;
      char * zeile;
    
      if(!kette->anzahl)
        return "";
        
      alt = kette->kopf;
      kette->kopf = alt->weiter;
      kette->anzahl--;
    
      zeile = alt->zeile;
      free(alt);
      return zeile;
    }
    
    int main(int argc, char ** argv)
    {
      kette_t test;
    
      kette_init(&test);
    
      kette_merken("hallo 1\n", &test);
      kette_merken("hallo 2\n", &test);
      kette_merken("hallo 3\n", &test);
    
      while(test.anzahl)
      {
        printf(kette_erinnern(&test));
      }
    
      getchar();
      return 0;
    }
    Fehlerbehandlung habe ich jetzt wegen der Übersichtlichkeit weggelassen.

    Beitrag zuletzt geändert: 25.12.2012 1:22:40 von darkpandemic
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!