einfach und doppelt verkettete Listen....



  • Dachstuhl92 schrieb:

    @Steffo:
    Die beiden Internetseiten -danke dafür- kenn ich bereits. Ich schau sie mir nochmal an und hoffe es klappt dann.

    Einfacher wird man Listen kaum erklären können und wenn du einer bestimmten Stelle nicht mehr weiterkommst, kannst du dein Code posten und wir können evtl. drübersehen.

    L. G.
    Steffo



  • @Mechanics:
    naja, vielleicht hast du Recht. Ist halt wirklich neu, und muss erst "Erfahrung" sammeln. Nun ja, ich werd mir den Link mal anschauen, und hoffe es dann beim nächsten Mal besser zu machen 😉

    @Steffo:
    ich hab unten mal den Code reinkopiert, von einem Programm, welches speziell das mit den einfachen Listen irgendwie darstellen soll. Also Ziel von dem Programm ist lediglich Listen zu erstellen, per Hand Daten in sie einzugeben und anschließend die einzelnen Listenelemente auszugeben.

    Nun zu meinem Problem in dem Code, ich bekomm immer eine Fehlermeldung:
    "Zeile 28: invalid type argument of 'unary*' "

    ich vermute es hängt mit dem Stern zusammen, weiß aber nicht so richtig wie ich das ändern kann.

    Hoffe das war jetzt ein bisschen besser beschrieben....

    Gruß

    #include<stdio.h>
    #include<stdlib.h>
    
    main () {
    //Strukt erstellen:
         struct liste {
                int nummer;
                char name[10];
                char aufgabe[10];
                struct liste *next; 
                };
    //Listenkopf und -ende festlegen:
    struct liste zeiger;
           zeiger.nummer=1;
           strcpy(zeiger.name,"Test01");
           strcpy(zeiger.aufgabe,"testen");
           zeiger.next=NULL;
    
    int i,j;  //zaehler
    char eingabe[10];
    
    j=i=0;
    
    printf("Zum Beenden bei Listenaufgabe 'Ende' eingeben!\n");
    
    do {
        struct liste neues_element;
        neues_element=malloc(sizeof(*neues_element));
        printf ("\nBitte Listennummer eingeben: ");
        scanf("%d",neues_element.nummer);
    
        printf("\nBitte Listenname(10) eingeben: ");
        gets(eingabe);
        strcpy(neues_element.name,eingabe);
    
        printf("\nBitte Listenaufgabe(10) eingeben: ");
        gets(eingabe);
        strcpy(neues_element.aufgabe,eingabe);
    
        neues_element.next=NULL;
        i++; 
    } while (eingabe!="Ende");
    printf("\n---------------------------------------------------------\n");
    printf("Liste:\n");
    do {
        j++;
        printf("Gespeichertes Element %d:\n",j);
        printf("Elementnummer: %d\n",zeiger.nummer);
        printf("Elementname: '%s'\n",zeiger.name);
        printf("Elementaufgabe: '%s'\n",zeiger.aufgabe);
        i--;
    } while(i<0);
    
    getchar();
    
    return 0;
    
    }
    

    - Ach übrigens, wenn es noch relevant sein sollte, ich programmier unter Win7 mit dem DevC++

    - Fehlermeldung bezieht sich auf die Zeile mit dem "malloc".

    Besten Dank nochmal 🙂



  • Dachstuhl92 schrieb:

    - Fehlermeldung bezieht sich auf die Zeile mit dem "malloc".

    Habe gerade keinen Compiler bei der Hand, aber es müsste so aussehen:

    struct liste *neues_element;
        neues_element= malloc(sizeof(struct liste));
    


  • Das

    struct liste *neues_element; // der * hat gefehlt
    

    sollte reichen.

    Ein cast beim malloc ist in C nicht nötig.

    @Dachstuhl92
    Wenn du cpp statt code -Tags nimmst wirds auch bunt im Code
    (oder du klickst den C/C++ Button an statt Code.



  • Hey,

    danke. Jetzt läuft zumindest das programm einmal. Es macht zwar noch nciht ganz was es soll, aber immerhin, besten Dank.
    Gruß

    @DirkB:
    ich werd mich nächstes Mal dran halten.



  • Mechanics schrieb:

    Das ist die einfachste Datenstruktur, die man sich überhaupt vorstellen kann. Das Internet ist voll von Beispielen. Such dir einfach was zusammen. Ich kann wirklich keinen Grund vorstellen, warum jemand seine Zeit verschwenden sollte, dir was zu erklären. Sowas kannst du am besten einen Lehrer oder einen Freund fragen, der sich besser auskennt als du. Aber einfach fremde Leute fragen, die dich nicht kennen, und für die es völlig trivial und uninteressant ist, halte ich für wenig erfolgversprechend.

    Junge hör mal auf in sämtlichen Unterforen rumzupoltern. Du musst Deine überhebliche Art und miese Laune nicht an jedem Anfänger auslassen.



  • an jedem nun auch wieder nicht. Ich wurde bisher verschont 🤡

    Aber im Grunde sollte man im Hinterkopf behalten: Konstruktiv antworten oder Schnauze halten. Damit ist allen geholfen...



  • Ich rall das noch nicht so ganz.

    Das ist unsere Datenstrucktur:

    struct list_node {
    	int data; // Die Daten
    	struct list_node *next; //Der Next Pfeil bzw Zeiger auf nächstes Element
     };
    

    Aber nu haperst beim Einfügen eines neuen Elements:

    node insert_right(node list, int data){ //Wird das jetzt als Funktion implementiert?
    	node new_node = (node) malloc(sizeof(struct list_node));// Ok hier wird ein neuer "Datensatz" bzw ein Listenelement erstellt und speicher geholt
    	new_node->data = data; //schreibt die daten in das neue Listenelement
    	new_node->next = list->next;//das ist der Zeiger der auf das Rechte element zeigt
    	list->next     = new_node; //und das ist der zeiger der jetzt auf das neue element zeigt
    	return new_node;//gibt die Liste wieder aus.
    }
    

    Sind meine Kommentare soweit richtig? Es geht um das Beispiel der einfach verketteten 😃


  • Mod

    struct list_node {
    	int data; // Die Daten
    	struct list_node *next; //Der Next Pfeil bzw Zeiger auf nächstes Element
     };
    

    Korrekt.

    node insert_right(node list, int data){ // Ja, das wird jetzt als Funktion implementiert. Wie oder wann sonst?
    	node new_node = (node) malloc(sizeof(struct list_node));// Hier wird Speicher passend für ein neues Listenelement geholt, aber nichts erstellt. Wir sind hier nicht in C++. Außerdem ist der Cast unnötig, das wäre ebenfalls C++.
    	new_node->data = data; 
    	new_node->next = list->next;
    	list->next     = new_node; 
    	return new_node;
    }
    

    Das was ich nicht korrigiert habe, ist sinngemäß* korrekt.

    *: Du solltest dir angewöhnen, dich exakt und korrekt auszudrücken. Viele deiner Kommentare muss man doppelt und dreifach lesen, um zu verstehen, was du wohl meinst. Bei deiner Frage "Wird das jetzt als Funktion implementiert?" weiß ich immer noch nicht, was gemeint ist. Und andere Aussagen habe ich nur als korrekt angesehen, weil sie auch zu der richtigen Lösung passen, nicht weil dies unbedingt aus dem was du schreibst hervorgeht.

    Wenn du dich kaum für Menschen verständlich ausdrücken kannst, wie willst du dann einen Computer programmieren, der nicht mitdenken kann?



  • Bei deinem Beispiel wird das neue Element hinter dem Übergebenen (list) eingefügt

    Und es wird auch nicht die Liste zurückgegeben sondern nur (der Zeiger auf) das neue Element.


Anmelden zum Antworten