verkettete Liste

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
ZimZalabim
Beiträge: 21
Registriert: So Feb 24, 2013 6:27 pm

verkettete Liste

Beitrag von ZimZalabim » Mi Dez 18, 2013 8:30 pm

Hallo Zusammen

Ich versuch gerade verkettete Listen zu verstehn. Die Theorie hab ich verstanden, bei der umsetzung haperts noch.

Code: Alles auswählen

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

typedef struct 
{
	char *vorname;
	char *nachname;
	int alter;
	struct PersonenListe *next;
	struct PersonenListe *perv;
}PersonenListe;

// int isEmpty(liste) { if(liste nicht leer) return 1; else return 0;}

// int anzahlListenElement(liste) {return anzahl;}

// PersonenListe addElement(liste, char *vorname, char *nachname, int alter) {return liste;}

//void printListe(liste) {}

// PersonenListe delElement(liste) {return liste;}

int main(void)
}
		
	return 0;
}
1. Wie bzw. Wo kann ich feststellen wieviele Elemente schon in der Liste sind? Gibt es eine Funktion ElementeZaelen?
2. Mir ist noch nicht klar wie ich ein neues Element eingefuegt werden soll, an eine bestimmte Position

Danke

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: verkettete Liste

Beitrag von mfro » Mi Dez 18, 2013 9:01 pm

ZimZalabim hat geschrieben: 1. Wie bzw. Wo kann ich feststellen wieviele Elemente schon in der Liste sind? Gibt es eine Funktion ElementeZaelen?
Nur, wenn Du sie (richtig) schreibst (ElementeZaehlen) ;).

Auch wenn dein Programm noch nicht besonders "ausgereift" ( ;) ) ist, fällt mir gleich was auf: Du hast die Struktur "PersonenListe" genannt. Das ist schon mal ein wenig ungeschickt, weil das ja keine Liste ist, sondern nur ein Element davon. Mag pingelig erscheinen, aber beim Programmieren tut man sich m.E. viel leichter, wenn man die Dinge als das benennt, was sie sind:

Code: Alles auswählen


struct person
{
  struct person *next;

  char *vorname;
  char *nachname;
  int alter;
};

/*
 * bestimme Anzahl Elemente einer mit NULL beendeten Personenliste
 */
int num_elements(struct person *start)
{
  struct person *p = start;
  int anz = 0;

  while (p)
  {
    anz++;
    p = p->next;
  }
  return anz;
}
Weiterhin hast Du gleich die Kür gewählt - die doppelt verkettete Liste. Die braucht man eigentlich nur dann, wenn man die Liste auch in zwei Richtungen (vorwärts _und_ rückwärts) durchlaufen (Informatiker sagen "iterieren" dazu) können will, was dann nützlich ist, wenn man schon weiß, in welche Richtung es wohl "näher" zum gewünschten Element sein könnte (also wenn die Liste sortiert ist).

Ansonsten machst Du die Sache nur unnötig kompliziert und ineffizient (weil Du Zeiger verwalten mußt, die Du gar nicht brauchst oder nicht nutzt).
ZimZalabim hat geschrieben: 2. Mir ist noch nicht klar wie ich ein neues Element eingefuegt werden soll, an eine bestimmte Position
Dazu solltest Du dir zunächst mal klar werden, wie Du die Speicherverwaltung realisieren willst. Also mal nachlesen, was malloc() und free() machen und wie man damit umgeht. Wenn Du dann Personenelemente allokieren und wieder freigeben kannst, kommst Du wahrscheinlich sehr schnell von alleine drauf, wie Du die "next"-Zeiger der einzelnen Personenelemente setzen ("verketten") mußt, damit eine Liste draus wird.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten