Verkettete Liste

godofkills

Lt. Commander
Dabei seit
Dez. 2009
Beiträge
1.997
Edit: Es handelt sich um c/c++!

Hallo, habe ein kleines Problem.
Und zwar soll ich eine verkette liste erstellen. was ich auch nach meiner meinung gemacht habe:

head=NULL;
char w;
do
{
struct strvab *p;
p=(struct strvab *)malloc(sizeof(struct strvab));
system("cls");
cout<<"Bitte geben Sie den Vornamen ein: ";
cin>>p->vname;
cout<<"Bitte geben Sie den Namen ein: ";
cin>>p->nname;
cout<<"Bitte geben Sie den Geburtstag ein: ";
cin>>p->gdatum;
cout<<"Bitte geben Sie die Strasse ein: ";
cin>>p->strasse;
cout<<"Bitte geben Sie die Hausnummer ein: ";
cin>>p->hausnummer;
cout<<"Bitte geben Sie die PLZ ein: ";
cin>>p->plz;
cout<<"Bitte geben Sie den Ort ein: ";
cin>>p->ort;
cout<<"Bitte geben Sie die Telefonnummer ein: ";
cin>>p->telefon;
cout<<"Bitte geben Sie die e-mail Adresse ein: ";
cin>>p->email;
cout<<"Bitte geben Sie die Handy Nummer ein: ";
cin>>p->handy;
if(head==NULL)
{
head=p;
}
ofstream datei("Adressen.txt", ios::app);
datei<<endl;
datei<<p->vname<<" "<<p->nname<<" "<<p->gdatum<<" "<<p->strasse<<" "<<p->hausnummer<<" "<<p->plz<<" "<<p->ort<<" "<<p->telefon<<" "<<p->email<<" "<<p->handy;
datei<<endl;
datei.close();
cout<<"Wollen Sie aufhören j/n";
cin>>w;
}while(w=='n');
}

so und nun geht es zum auslesen was wie folgt aussieht:

ausgabe() //ausgabe
{
head=NULL;
int anz=0,x;
struct strvab *p;
ifstream aus_datei("Adressen.txt");
cout<<"\t\tAusgabe der gespeicherte Eintr\x84 \bge\n\n";
while (!aus_datei.eof())
{
p=(struct strvab *)malloc(sizeof(struct strvab));
aus_datei >> p->vname;
aus_datei >> p->nname;
aus_datei >> p->gdatum;
aus_datei >> p->strasse;
aus_datei >> p->hausnummer;
aus_datei >> p->plz;
aus_datei >> p->ort;
aus_datei >> p->telefon;
aus_datei >> p->email;
aus_datei >> p->handy;
if(head==NULL)
{
head=p;
}
p=p->next;
anz++;
}
p=head;
for(x=0;x<=anz;x++)
{
cout<<"Vorname: "<< p->vname;
cout<<endl;
cout<<"Nachname: "<< p->nname;
cout<<endl;
cout<<"Geburtstag: "<< p->gdatum;
cout<<endl;
cout<<"Strasse: "<<p->strasse;
cout<<endl;
cout<<"Hausnummer: "<< p->hausnummer;
cout<<endl;
cout<<"PLZ: "<<p->plz;
cout<<endl;
cout<<"Ort: "<< p->ort;
cout<<endl;
cout<<"Telefon Nummer: "<<p->telefon;
cout<<endl;
cout<<"e-mail: "<< p->email;
cout<<endl;
cout<<"Handy Nummer: "<<p->handy;
cout<<endl;
cout<<endl;
cout<<endl;
p=p->next;
}
}

nur kommt das eine zugriffsverletzung als meldung. also denk ich das es den zeiger nicht gibt auf den ich da zeige. sehe aber trotzdem nicht mein fehler
 
Zuletzt bearbeitet:

badday

Commander
Dabei seit
Sep. 2007
Beiträge
3.023
Debugge das ganze doch einfach mal und schau, wo die Speicherverletzung auftritt. Der Code ist ja leider wirklich sehr unübersichtlich...
Warum verwendest du nicht einfach einen Container etc.?

Gruß,

badday
 

godofkills

Lt. Commander
Ersteller dieses Themas
Dabei seit
Dez. 2009
Beiträge
1.997
muss verkettete listen nehmen -.-. habs mir auch nicht ausgesucht....
das hier kommt
Unbehandelte Ausnahme bei 0x0043d93c in Adressbuch.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xcdcdcdcd.


nach dieser zeile p=p->next;
also geh ich davon aus der zeiger nicht auf was zeigt was da ist. aber im debugger wird angezeigt das p wieder auf head ist und den ersten eintrag auch ausgibt. aber den zweiten nicht
 

BerniG

Lieutenant
Dabei seit
Okt. 2004
Beiträge
622
Irgendwie baust du nirgends eine verkettete Liste. Normal müsstest du dazu p->next irgendwo zuweisen aber das fehlt sowohl beim Einlesen als auch Auslesen. Beim Einlesen schreibst du ja im Grunde nur den head und danach landen die Variablen im Nirwana (Speicherleck!). Brauchst du eigentlich beim Einlesen überhaupt die verkettete Liste denn zumindest im Codeausschnitt macht das so keinen Sinn. Bitte immer beachten dass mit malloc alloziierter Speicher auch per free nach Benutzung freigegeben wird. Bei deiner Ausgabe fehlt das nämlich definitiv...

Dein Problem das zum Absturz führt ist Folgendes: p=p->next; führt in der Regel dazu, dass p = null ist (genau genommen ist der Wert undefined weil du die Variable nicht initialisiert hast). Im nächsten Schleifendurchgang schlägt dann p=(struct strvab *)malloc(sizeof(struct strvab)); fehl weil man ja nicht eine Variable in "null" speichern kann.

Deine Logik bei der Ausgabe müsste statt
Code:
if(head==NULL)
{
head=p;
}
p=p->next;
eher so heißen:
Code:
p->next = head;
head=p;
Du brauchst übrigens auch kein "anz" um dann anschließend durch die Liste zu gehen. Einfach auf p!= null prüfen reicht und ist das was man normal macht.

Bitte nutze nächstes Mal das CODE-Tag hier im Forum und poste den Code etwas formatiert.
 
Zuletzt bearbeitet:
Top