C - Listen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • C - Listen

    Wahrscheinlich ist mein Problem recht trivial, aber irgendwie bekomm ich es einfach nicht hin, die Listenelemente über eine Zählvariable auszugeben.

    Die Funktion sieht folgendermaßen aus:

    Code:
    void ausgabe(struct element *start){
        int j=0;                //Iterationsvariable
    
        if(start != NULL){          
            printf("%d. %s\n", j++, start->zeichenkette);
            ausgabe(start->next);
        }
    }
    hierbei werden leider alle eingaben mit der gleichen iterationsvariablen ausgegeben....
    wenn ich eine while-schleife nutze, wird aber daraus ne endlosschleife...

    done...

    to be continued

    Wäre es möglich, wenn mal eben jemand über den Quellcode schaut?

    Also ich soll Zeichenketten zeilenweise über stdin einlesen und in dynamisch angeforderte Speicherbereiche übertragen (ans aktuelle Ende der verketteten Liste).
    Folgende Struktur soll verwendet werden:

    Code:
    struct element {
    struct element *next;
    char *zeichenkette;
    };
    Die Listenelemente sind ebenfalls durch dyn. Speicheranforderung bereitzustellen. Nach Eingabe sollen die Zeichenketten nummeriert ausgegeben werden und vor Beendigung des Proggs sollen alle Speicherbereiche wieder freigegeben werden.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAXSTR_L 60
    
    
    //Knotendefinition
    struct element{
        char *zeichenkette;                      //Speicherzelle
        struct element *next;               //naechstes Kettenglied
    };
    int j = 0; 
    int i = 1;                             
    
    //Prototypen
    struct element *einfuegen(char *puffer);
    void ausgabe(struct element *start);
    void leeren(struct element *plauf);
    
    
    int main (int argc, char ** argv){
    
        struct element *start = NULL, *ende = NULL;
        char *puffer = (char*)malloc(MAXSTR_L*sizeof(char));
    
        while(fgets(puffer, MAXSTR_L, stdin) != NULL){
            puffer[strlen(puffer)-1] = '\0';
            j++;                            //Zähle jeden Eintrag
            if(start == NULL){
                start = einfuegen(puffer);
                ende = start;
            }else{
                     ende -> next = einfuegen(puffer); 
                     ende = ende -> next; 
                }
            }
        ausgabe(start);
        leeren(start);
        system("PAUSE");
        return 0;
    
    }
    
    
    struct element *einfuegen(char *puffer){        //unsortiert
        struct element *tmp = (struct element* ) malloc( sizeof(struct element));
        tmp -> zeichenkette = (char*)malloc(strlen(puffer)+1);
        strcpy(tmp -> zeichenkette, puffer);
        tmp -> next = NULL;
        return tmp;
    }
    
    void ausgabe(struct element *start){
        if(start != NULL){      
            while (i<=j){
            printf("%d. %s\n", i, start->zeichenkette);
            i++;
            ausgabe(start->next);
            }
        }
    }
    
    void leeren(struct element *start){
    
        while(start != NULL){
            free(start -> zeichenkette);
            leeren(start -> next);
        }
        free(start);
    }
    über gute ratschläge und tipps würde ich mich sehr freuen...
    Zuletzt geändert von unset; 01.06.2010, 11:26. Grund: Tripple-Post

  • #2
    Mein erster Ratschlag ist, dass du den Edit-Button benutzt!
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      sorry @ unset
      aber nun hätte ich doch ne frage.

      ich soll in der liste nach zeichenketten suchen und diese ausegeben, die über die als kommandozeilenargument übergeben wurden

      ich bin mir nicht sicher, ob ich das richtig verstehe. folgenden weg würde ich einschlagen??!

      Code:
      void suche(char ** argv, struct element *start){
          
             if(start != NULL){
                
                 do{
                     if(strstr(start -> zeichenkette, argv) != NULL){
                    puts(start -> zeichenkette);
                     }
                     start = start -> next;
                 }while(start -> next != NULL);
              }
      }

      Kommentar


      • #4
        Ich habs nur kurz überflogen, aber eigentlich solltest du da doch z.T. auch Fehler bekommen oder nicht?
        Zur allerersten Frage: j ist eine lokale Variable, die du als 0 initialisiert und danach jeweils um eins erhöht wird (jedes Mal!)
        Zum letzten Beitrag:
        strstr erwartet einen Pointer zu char dü übergibst aber einen Pointer zu einem Pointer siehe deine eigene Funktionsdeklaration: char ** argv, struct element *start.
        Wenn du eine konkrete Frage hast dann schreib doch einfach wieder, aber jemanden, der dir alles einfach durchschaut und nach Gutdünken abändert wirst du wahrscheinlich nicht finden.

        Kommentar

        Lädt...
        X