Alt 06.04.2012, 17:41:22   #1
tkiela
Hüüüüäääh? :):)
Benutzerbild von tkiela

ID: 295523
Lose senden
Reallife

Reg: 25.08.2007
Beiträge: 635
Standard Verkettete Liste - Zeiger wird nicht geändert

Hallo.
Ich steh glaub ich gerade auf dem Schlauch.
Ich möchte eine verkettete Liste erstellen.
Die Liste sieht so aus:
PHP-Code:
1:
2:
3:
4:
5:
6:
typedef struct Liste_izahlen {
    
int zahl;
    
struct Liste_izahlen *next;
Liste;

Liste *start_unsorted NULL, *p
Die insert-Funktion sieht so aus:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
void insert (int izahlListe *start)
{
    
Liste *zeiger;
    if(
start == NULL) {
           if((
= (Liste *) malloc(sizeof(Liste))) == NULL
                {
                 
printf("Kein Speicherplatz vorhanden.\n");
                 return;
                }
           
p->zahl izahl;
           
p->next NULL;
           
start p;
    }


Rufe die funktion folgender maßen auf:
PHP-Code:
1:
insert(izahlstart_unsorted); 
izahl ist ganznormal Integer, start_unsorted ist ein Zeiger auf die Liste. Ganz am Anfang ist dieser Zeiger natürlich NULL.
Ich hab die mal ein wenig gekürzt - das wesentliche ist allerdings noch vorhanden. Ich suche mir mit malloc eine Speicheradresse für das erste Element der Liste. Der Zeiger darauf steht dann in p.
Ich dachte eigentlich, dass ich jetzt durch start = p; auch start_unsorted auf den Wert von p setze.
Wo ist mein Denkfehler?

Ich werd jetzt erstmal paar Stunden abstand davon nehmen, damit ich das ganze danach nochmal klarer betrachten kann, danke aber soweit schonmal für Hilfe!
 

Geändert von tkiela (06.04.2012 um 18:04:39 Uhr)
tkiela ist offline   Mit Zitat antworten
Alt 06.04.2012, 18:04:28   #2
theHacker
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.689
Standard

Zitat:
Zitat von tkiela Beitrag anzeigen
Ich dachte eigentlich, dass ich jetzt durch start = p; auch start_unsorted auf den Wert von p setze.
Wo ist mein Denkfehler?
Dass die Variable *start in insert() nur eine lokale Variable ist. Und lokale Variablen verlieren am Funktionsende ihre Gültigkeit.

Damit du einen Zeiger mittels einer Zeiger umbiegen kannst, brauchst du einen Zeiger auf einen Zeiger.
Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
void insert (int izahl, Liste *start) void insert (int izahl, Liste **start) if(start == NULL) if(*start == NULL) start = p; *start = p; insert(izahl, start_unsorted); insert(izahl, &start_unsorted);
**start bleibt konstant. Eine Änderung würde nicht funktionieren. Wenn du allerdings *start änderst, funktioniert das, weil du (wie am *-Operator zu erkennen) einmal dereferenzierst und woanders einen Wert änderst.

Allerdings würd ich dir das keinesfalls empfehlen, weil du eh schon einen großen konzeptionellen Fehler drin hast:
Der Startelement start_unsorted ist bei dir eine globale Variable. Warum willst du es dann als Funktionsparameter mitgeben?

(Alle Angaben ohne Gewähr. Dein Debugger hilft dir )
theHacker ist offline   Mit Zitat antworten
Alt 06.04.2012, 18:12:04   #3
tkiela
Hüüüüäääh? :):)
Benutzerbild von tkiela

ID: 295523
Lose senden
Reallife

Reg: 25.08.2007
Beiträge: 635
Standard

Besten Dank für die schnelle Antwort!

Klingt soweit ja logisch - schade, dass ich nicht selber darauf gekommen bin.

Ich habe noch eine 2. Liste, start_sorted, und eine 2. Funktion insert_sort. Die insert_sort funktion macht nichts anderes, als im richtigen Moment die insert Funktion aufzurufen. Deswegen wird es nicht funktionieren, die globale Variable in insert direkt anzusprechen. Oder ist das ein weiterer Denkfehler?

Habe übrigens auch noch einen Ausweg gefunden, indem ich mir den Zeiger, bzw. die Adresse einfach returne und dann nach dem Funktionsaufruf die globale Variable dahingehend ändere. Funktioniert dann mit ein paar Typenumwandlungen.
Welcher Weg ist da eleganter, effizienter bzw. einfach besser? Mit den Zeigern wohl, oder?
 
tkiela ist offline Threadstarter   Mit Zitat antworten
Alt 06.04.2012, 18:35:25   #4
theHacker
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.689
Standard

Zitat:
Zitat von tkiela Beitrag anzeigen
Ich habe noch eine 2. Liste, start_sorted, und eine 2. Funktion insert_sort. Die insert_sort funktion macht nichts anderes, als im richtigen Moment die insert Funktion aufzurufen. Deswegen wird es nicht funktionieren, die globale Variable in insert direkt anzusprechen. Oder ist das ein weiterer Denkfehler?
Nö, das is dann korrekt.
Zitat:
Zitat von tkiela Beitrag anzeigen
Habe übrigens auch noch einen Ausweg gefunden, indem ich mir den Zeiger, bzw. die Adresse einfach returne und dann nach dem Funktionsaufruf die globale Variable dahingehend ändere. Funktioniert dann mit ein paar Typenumwandlungen.
Aber nicht im Sinne von funktionaler Programmierung, wenn du dir Arbeit dann nach Funktionsaufruf selber machst.
Zitat:
Zitat von tkiela Beitrag anzeigen
Welcher Weg ist da eleganter, effizienter bzw. einfach besser? Mit den Zeigern wohl, oder?
Der zweite Weg sicher nicht.
Der erste Weg... wenn du nur C zur Verfügung hast und kein C++ und es bei genau zwei Listen bleibt, ok. Stell dir vor, du hast 100 Listen oder 1000 Listen, dann brauchst du ein Array von Zeigern (d.h. alle ** werden zu *** ) oder ...

Richtig ordentlich machst du es mit einer Klasse
theHacker ist offline   Mit Zitat antworten
Alt 06.04.2012, 22:36:38   #5
tkiela
Hüüüüäääh? :):)
Benutzerbild von tkiela

ID: 295523
Lose senden
Reallife

Reg: 25.08.2007
Beiträge: 635
Standard

Alles klar.

Habe nur C zur Verfügung und es bleibt nur bei den beiden Listen. Werde es dann dahingehend ändern.

Besten Dank nochmal!
 
tkiela ist offline Threadstarter   Mit Zitat antworten
Antwort

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[C] Zeiger auf Funktionen DelphiKing Programmierung 2 15.06.2009 20:18:36
DB updaten Teil 2 - es wird nur ein Wert geändert! Ronja Programmierung 5 07.02.2007 12:22:25
[XHTML] Bild in Liste wird zu groß dargestellt *gelöst* Renegade Programmierung 0 02.01.2007 18:42:49
[Java] Verkettete Liste in Java ryk Programmierung 4 10.05.2006 21:32:40


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52:09 Uhr.