Computerhilfen.de Logo
Forum
Tipps
News

Einfach verkettete Liste in C

Hallo!

Ich versuche gerade Listen zu verstehn, aber irgendwie bekomme ich einen Knoten dabei in meinen Kopf. Ich habe mir eine Datenstruktur erzegt in der ich Vorname, Nachname und Alter einer Person abspeicher. Nun möchte ich die Datenstruktur für erstmal 5 Personen benutzen. Nur irgendwo habe ich mal wieder einen dicken Denkfehler. Mein bisheriges Programm:

//--------------------------------------------------------------------
//Header-Datei(header.h):

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include "string.h"

struct element
{
struct element *next;
char vorname[20];
char nachname[20];
int alter;
};

struct element *start =0;
//--------------------------------------------------------------------
//Meine Funktionen:

#include "header.h"

void add_element(struct element *e)
{
   e->next = start;
   start = e;
}


int main() //meine Liste
{
   int i;
   struct element d;
   struct element *e;

   for(i=0;i<5;i++)
   {
      printf("Bitte geben Sie einen Vornamen ein: ");
      scanf("%s", d.vorname);
      printf("Bitte geben Sie einen Nachnamen ein: ");
      scanf("%s", d.nachname);
      printf("Bitte geben Sie das Alter ein: ");
      scanf("%s", d.alter);
      add_element(e);
   }
   printf("%s", start->next->next->vorname);
   return 0;
}

Mit freundlichen Grüßen
Daniel


Antworten zu Einfach verkettete Liste in C:

Mach dir doch mal ne Zeichnung, wo du jeder Instanz deiner Struktur n Kästchen malst wie z.B.

            /------------\
            | *next   ---|-------------> <irgendwohin>
            |------------|
            | <name>     |
            |------------|
            | <alter>    |
            \------------/

Für jeden Pointer auf so eine Struktur machst nen Pfeil da zu dem Kästchen, und dann Spielst du deinen Algorithmus mal durch. Wirst schnell drauf kommen dass momentan was wichtiges fehlt -_-

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi!

Ich habe mir ja so eine Zeichnung gemacht, darum habe ich ja auch den Starpointer anfangs auf 0 gesetzt und dann dachte ich das ich immer ein Element dazischen einfädeln würde :o . Ich sehe den Fehler einfach nicht! Wahrscheinlich weil ich die Pointer noch immer nicht ganz verstanden habe. Die Zeigertheorie kann ich zwar runter beten aber in der Paraxis machen mir die Biester immer noch große Probleme. Für Erklärungen wäre ich dankbar!!!

Grüße
Daniel 

int main() //meine Liste
{
   int i;
   struct element d;
   struct element *e;

   for(i=0;i<5;i++)
   {
      printf("Bitte geben Sie einen Vornamen ein: ");
      scanf("%s", d.vorname);
      printf("Bitte geben Sie einen Nachnamen ein: ");
      scanf("%s", d.nachname);
      printf("Bitte geben Sie das Alter ein: ");
      scanf("%s", d.alter);
      add_element(e);
   }
   printf("%s", start->next->next->vorname);
   return 0;
}

Wo in diesem Code wird e mit einem Wert belegt und was passiert mit d?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi!

Ich dachte das ich den Pointer *e mit add element belege. In der Header steht er auf 0 und verschiebt sich wenn ein add_element ausgeführt wird auf *next, der dann wieder auf *e und somit 0 zeigt. Ich dachte das der Zeiger *next der in Strucktur Element enthalten ist als Verbindung zwischen d und e ausreichen würde??? Wie gesagt ich scheine noch einige Verständnisprobleme zu haben!!!

Ich habe das add_element jetzt an den Anfang der Schleife verschoben, aber dadurch wird mein Programm nach der Eingabe beendet. Vorher gab es einfach nur quatsch aus.


Grüße
Daniel

« Letzte Änderung: 08.07.05, 14:15:30 von Draglan »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hallo!

Kann mir vielleicht doch noch wer helfen :-[? Ich würde die Listen super gerne richtig verstehen! Kennt vielleicht jemand ein Tutorium das sehr leicht verständlich ist? Ich habe es mit C++ für Dummies und C++6 in 21 Tagen versucht aber verstanden habe ich sie trotzdem nicht ganz. Mein Versuchsprogramm macht einfach nicht was ich will. Keine Ahnung programmieren liegt mir nicht, aber ich brauche leider noch eine bestandene Fachprüfung in C++. Dann kann ich mich wieder mehr mit Elektrotechnik und Mathe befassen. Auch Assembler und andere niedrigere Programmiersprachen bereiten mir keine Probleme aber C++ ist für mich die Hölle.

Hilfesuchend
Daniel

Tipps zu tutorien gibt es in diesem Forum wohl zu Hauf  :P

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

struct element
{
struct element *next;
char vorname[20];
char nachname[20];
int alter;
};

struct element *start = 0;

void add_element(struct element *e)
{
   e->next = start;
   start = e;
}


int main() //meine Liste
{
   int i;
   struct element *e;

   for(i=0;i<5;i++)
   {
   e = malloc( sizeof( struct element ) );

   printf("Bitte geben Sie einen Vornamen ein: ");
   scanf("%s", e->vorname);
   printf("Bitte geben Sie einen Nachnamen ein: ");
   scanf("%s", e->nachname);
   printf("Bitte geben Sie das Alter ein: ");
   scanf("%d", &e->alter);
   add_element(e);
   }
   printf("%s", start->next->next->vorname);
   return 0;
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ersteinmal besten Dank!

Das ist auf jedenfall genau die Richtung die ich einschlagen wollte. Malloc sorgt dafür das es dynamisch angelegt wird? Und Sizeof ist für die Größe zuständig?

Es taucht nur noch ein kleiner Fehler, wenigstens bei mir, in der Zeile  e = malloc( sizeof( struct element ) ); auf:

error C2440: '=' : 'void *' kann nicht in 'struct element *' konvertiert werden

Habe es durch nachlesen zum laufen gebracht, bei meinem alten Visual C++ 6.0 muß es als:
 
e = (struct element *) malloc( sizeof( struct element) );

gemacht werden.

Nur verstanden habe ich das alles noch nicht genau, aber es funktioniert! Ich bin dir super dankbar ;D! Zumal ich klar noch einiges falsch gemacht hatte, aber du sogar auch meinen Ansatz weiter benutzt hast. Danke dafür so habe ich nicht das Gefühl gar nichts richtig gemacht zu haben ;). Kannst noch ein paar erklärende Worte finden, dann wäre ich total glücklich ::)? Gerade malloc und sizeof hatte ich vorher noch nicht benutzt.

Code:
#include <stdio.h>
#include <stdlib.h>
#include "string.h"

struct element
{
struct element *next;
char vorname[20];
char nachname[20];
int alter;
};

struct element *start = 0;

void add_element(struct element *e)
{
   e->next = start;
   start = e;
}


int main() //meine Liste
{
   int i;
   struct element *e;

   for(i=0;i<5;i++)
   {
   e = (struct element *) malloc( sizeof( struct element) );


   printf("Bitte geben Sie einen Vornamen ein: ");
   scanf("%s", e->vorname);
   printf("Bitte geben Sie einen Nachnamen ein: ");
   scanf("%s", e->nachname);
   printf("Bitte geben Sie das Alter ein: ");
   scanf("%d", &e->alter);
   add_element(e);
   }
   printf("%s", start->next->next->vorname);
   return 0;
}

Ein sehr dankbarer
Daniel


Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi!

Habe noch etwas dran rumgespielt nun wird die Liste auch komplett ausgegeben. Durch die Hilfe macht es schon fast Spaß! Ich kam einfach nicht mehr weiter:

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

struct element
{
struct element *next;
char vorname[20];
char nachname[20];
int alter;
};

struct element *start = 0;

void add_element(struct element *e)
{
   e->next = start;
   start = e;
}


int main() //meine Liste
{
   int i;
   struct element *e;

   for(i=0;i<5;i++)
   {
   e = (struct element *) malloc( sizeof( struct element) );

   printf("Bitte geben Sie einen Vornamen ein: ");
   scanf("%s", e->vorname);
   printf("Bitte geben Sie einen Nachnamen ein: ");
   scanf("%s", e->nachname);
   printf("Bitte geben Sie das Alter ein: ");
   scanf("%d", &e->alter);
   add_element(e);
   }

   for(e=start;e;e = e->next)
      printf("%s %s %d", e->vorname, e->nachname, e->alter);
   
   return 0;
}

Ein freudiger
Daniel

« Letzte Änderung: 16.07.05, 00:06:00 von Draglan »

« VB 6.0 Fehlende Bezeichnung des Buttonafänger »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!