Listen

Schnelle objektorientierte, kompilierende Programmiersprache.
Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Listen

Beitrag von Empire » So Mär 15, 2009 12:32 pm

HI wie so oft hab ich ein problem. ich will eine liste von allen bücher die ich lese machen.

Code: Alles auswählen

struct buch {
             char  Buchtitel[20];
             char  Autor[30];
             char  ISBNummer[15];
             char  Inhalt[500];
             char  Kommentar[100];
};

struct liste {
              struct buch;
              struct element *next;
};

struct listenkopf {
                   unsigned int anzahl;
                   struct liste *first;
}; 
So soll das aussehen. Bis hierher hat CodeBlocks auch keine Probleme.
ABER ich schaff es einfach nicht das man im Programm:
- Neue bücher Aufnehmen kann
-Alte überarbeiten
-alle bücher anzeigen lassen kann
- bücher suchen kann - nach autor
- nach Titel

Ich hab zwar ein bUch wo das beschrieben ist aber niht so das ich es verstehe, im Tutorial hats noch nichts dazu, im internet versteh ichs auch net und ein Solches Thema gibt es bis jetzt auch noch nicht
Kann mir jemand (mal wieder) jemand helfen?

mfg
Empire

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Listen

Beitrag von cloidnerux » So Mär 15, 2009 12:41 pm

Du brauchst ncoh ein Pointer auf das Vorherige Element.
Um dann ein nues Element zu Initialisieren allokierst du neuen Speicher, und setzt den Pointer auf diesen Speicher.
Dann sagst du dem lezten element das dort das nächste ist und bei dem neuen Ebenfals. Und um jezt balle Anzeigen zu lassen, gehst du einfach entlang der Pointer.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Listen

Beitrag von Empire » So Mär 15, 2009 12:42 pm

Das sagt das buch auch.
Aber wie kanste bitte bsp machen?
thx
mfg
Empire

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Listen

Beitrag von cloidnerux » So Mär 15, 2009 12:56 pm

Also:

Code: Alles auswählen

struct buch {
             char  Buchtitel[20];
             char  Autor[30];
             char  ISBNummer[15];
             char  Inhalt[500];
             char  Kommentar[100];
};

struct liste {
              struct buch;
              struct element *nächstes;
              struct element *vorheriges;
};

struct listenkopf {
                   unsigned int anzahl;
                   struct liste *first;
}; 
struct element *aktuell;
Dann willst du ein Neues Elemnt Initialsieren:

Code: Alles auswählen

void neues_element(<variablen>){
   aktuell=listenkopf.first;
   for(i=0;i<listenkopf.anzahl;i++){
      aktuell=*aktuell.nächstes;                    //immer zum nächsten element springen bis man am ende ist.
   }
   aktuell.nächstes=malloc(sizeof(struct element));
   aktuell=aktuell.nächstes;
   //Das Element Initialsieren(mit werten füllen)
}
Und um jedes element auszugeben:

Code: Alles auswählen

void alle_elemente_ausgeben()
{
   aktuell=listenkopf.first;
   for(i=0;i<listenkopf.anzahl;i++){
      printf("%s, %s, %s....",aktuell.name......);
      aktuell=*aktuell.nächstes;                    //immer zum nächsten element springen bis man am ende ist.
   }
Das ganze ist nur ein besipiel.
Ich habe es nciht getestet.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Listen

Beitrag von nufan » So Mär 15, 2009 1:13 pm

Empire hat geschrieben:Ich hab zwar ein bUch wo das beschrieben ist aber niht so das ich es verstehe, im Tutorial hats noch nichts dazu, im internet versteh ichs auch net und ein Solches Thema gibt es bis jetzt auch noch nicht
Kann mir jemand (mal wieder) jemand helfen?
Und was ist das? ;)
cloidnerux hat geschrieben:Du brauchst ncoh ein Pointer auf das Vorherige Element.
Bei einer einfach verketteten Liste nicht...
cloidnerux hat geschrieben: Das ganze ist nur ein besipiel.
Ich habe es nciht getestet.
Sieht man... da sind mehrere schwere Fehler drin:
Wo deklarierst du den Typ "element"? Es wäre sinnvoll zu erwähnen, warum eine Struktur für eine Liste immer zwei Namen haben sollte.
Wenn man einen Pointer auf eine Struktur hat, verwendet man '->' statt '.'.
Sowohl '->' als auch '.' haben höhere Priorität als '*', deshalb ist etwas wie

Code: Alles auswählen

aktuell=*aktuell.nächstes;       
auf keinen Fall richtig.
Ich weiß, dass das nur eine ungefähre Vorstellung von Listen sein sollte, trotzdem ist es falsch.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Listen

Beitrag von Dirty Oerti » So Mär 15, 2009 2:07 pm

cloidnerux hat geschrieben:Du brauchst ncoh ein Pointer auf das Vorherige Element.
Stimmt doch gar nicht :)

Die structs sehen doch schon ganz gut aus.
Was dir fehlt ist, wie du damit umgehst.

Am besten erstellst du dir zuallererst einen Listenkopf (per malloc,new). Der Listenkopf steht praktisch für die Liste.
Zu Beginn ist die Liste leer, deswegen Pointer und Zähler auf 0.
Fügst du jetzt ein Element ein, dann musst du den Pointer nur auf das neu erstellte struct liste zeigen lassen.
Next ist leer, denn es gibt ja nur ein Element.
Die Anzahl im Listenkopf solltest du natürlich um eins erhöhen.

Beim Einfügen kommt es jetzt drauf an, wie du deine Liste organisieren kannst.
Entweder du hängst "hinten" an, oder du hängst "vorne" an.

Hinten:
Du gehst zum Ende deiner Liste.
Heißt, du hast einen Zeiger auf ein struct liste, den setzt du erstmal auf das element "first" aus deinem Listenkopf.
Dann gehst du weiter.
zeiger = zeiger->next.
Und zwar so lange, bis zeiger->next == NULL ist.
Dann bist du am Ende angelangt.
Du setzt dann einfach zeiger->next auf dein neues Element und aktualisierst im Listenkopf die Anzahl.

Vorne:
Du setzt den "next"-Zeiger des neuen Elements auf "first", und setzt dann "first" auf dein neues Element.

Du kannst natürlich auch in der Mitte einsetzen, wie das funktioniert kannst du dir jetzt aber selber überlegen :)
Löschen geht ähnlich, du musst nur darauf achten, dass die Kette nicht abreist.

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Listen

Beitrag von Empire » So Mär 15, 2009 2:14 pm

ich hab mich vorher irgend wie verklickt weil bei mir stand das die seite noch nicht existiert
mfg
Empire

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Listen

Beitrag von nufan » So Mär 15, 2009 3:26 pm

Empire hat geschrieben:ich hab mich vorher irgend wie verklickt weil bei mir stand das die seite noch nicht existiert
c:index ist nicht ganz aktuell, nimm lieber c:start.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Listen

Beitrag von Empire » So Mär 15, 2009 6:12 pm

Sorry aber ich kapiers net kann mir jemand das fürs hinzufügen eines elements machen?
Dann kapier ichs vill wenn ich nicht immer schauen muss was im bsp was bei mir ist.

mfg
Empire

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Listen

Beitrag von nufan » So Mär 15, 2009 6:23 pm

Empire hat geschrieben:Sorry aber ich kapiers net kann mir jemand das fürs hinzufügen eines elements machen?
Dann kapier ichs vill wenn ich nicht immer schauen muss was im bsp was bei mir ist.
Ok, hier ein Beispiel (ein getestetes):

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

typedef struct Element        // Struktur für die Liste. Erklärung warum sie zwei Namen hat siehe unten.
{	
  struct Element *next;      // Zeiger auf den nächsten Knoten		                                
  int daten;                        // Zahl die in dem Knoten gespeichert wird.                  	
} Knoten;


int main ()
{

  int anz, i;                                             
  Knoten *listen_kopf, *ptr_knoten, *help;		             // Kopf der Liste und 2 Hilfszeiger

  
  listen_kopf = NULL;	                                // Liste ist leer
  
  printf ("Anzahl: ");
  scanf ("%d", &anz);                                   // Eingabe der Anzahl
  
  printf ("\n\n");
  
  for (i = 0; i < anz; i++)                            // Erstellen von "anz"-Elementen
  {
  
    ptr_knoten = (Knoten *) malloc (sizeof(Knoten));        // Speicher für neues Element reservieren
    
    printf ("Zahl %d: ", i + 1);
    scanf("%d", &ptr_knoten -> daten);                      // Wert für den Knoten einlesen

    ptr_knoten -> next = listen_kopf;                    // Knoten wird am Beginn eingefügt
    listen_kopf = ptr_knoten;                              // neuer Knoten ist der neue Listenkopf
     
  }  
 
  
  printf ("\n\n");
  
  
  for (i = 0; i < anz; i++)                               // Ausgabe der Liste
  {
  
    printf ("%d\n", ptr_knoten -> daten);                 
    
    ptr_knoten = ptr_knoten -> next;                 // nächster Knoten
  
  }
  
  
  ptr_knoten = listen_kopf;                              // Pointer auf den Listenkopf setzen
  
  while (ptr_knoten != NULL)                             // Löschen der Liste; wenn der Pointer NULL ist, dann ist die Liste zu Ende
  {

    help = ptr_knoten -> next;                   // Adresse des nächsten Knotens speichern

    free (ptr_knoten);                               // Speicher freigeben

    ptr_knoten = help;                                 // dadurch bist du auf dem nächsten Knoten

  }
  
  printf ("\n");  
  
  return 0;

}
Nochmal zur Struktur. Sie hat zwei Namen, weil ein Member der Struktur ein Pointer auf eine Struktur vom selben Typ ist. Wenn du es so schreibst:

Code: Alles auswählen

typedef struct       // KEIN "Element" hier
{	
  struct Knoten *next;                                     
  int daten;                          	
} Knoten;
Dann ist der Typ "Knoten" in der Zeile mit "next" nicht bekannt. "Element" und Knoten sind das gleiche.


Vielleicht schreibst du einfach ein kleines Programm, das z.B. 3 Knoten in die Liste einfügt (erstmal ohne Schleife).

Antworten