2016-05-07 14 views
-2

Ich implementiere ein "Autoflotten" Management-Tool. Für den Start, erklärte ich einen „Auto“ struct:
verkettete Liste c verlierende Kopfadresse

typedef struct Car{ 
    char ID[9]; 
    struct Car* next; 
} Car; 

Meine Flotte wird einfach eine verkettete Liste von Autos sein. Ich beginne mit einem leeren Kopf und füge Links über die Funktion add_car hinzu.

void add_car (struct Car* cars_fleet){ 
    struct Car* car = malloc (sizeof (car)); 
    scanf("%s",car->ID); 
    car->next = NULL; 

if (cars_fleet == NULL){ 
    printf ("creating new list\n"); 
    cars_fleet = car;  
} 

else { 
    printf ("appending\n"); 
    Car* tmp = cars_fleet; 
    while (! (tmp->next == NULL)) 
     tmp = tmp->next; 
    tmp->next = car; 
} 
} 

Und das ist mein Hauptprogramm:

int main(){ 
Car* cars_fleet = NULL; 
add_car(cars_fleet); 
} 

Nun, aus irgendeinem Grunde, mein Programm alle Verbindungen behandelt, als ob sie die ersten waren. Ich nehme an, das passiert wegen falscher Speicherzuweisung, vielleicht bei "cars_fleet = car". Irgendwelche Tipps, Tipps oder Lösungen?
danke.

+0

Formatierung/Einrückung :( –

+0

'add _car (cars_fleet); 'kann cars_fleet nicht ändern, da es wertmäßig ist. –

+0

Also was wäre die richtige Syntax hier? Wenn die Flotte ein Zeiger ist und add_cars einen Zeiger auf das Auto erhält, warum kann ich die Adresse der Flotte nicht ändern? vielleicht sollte ich das neue Auto innerhalb der ersten IF-Klausel malloc? –

Antwort

0

Sie übergeben den Zeiger nach Wert. Daher hat jede Änderung in der Funktion void add_car (struct Car * cars_fleet) keine Auswirkung außerhalb der Funktion. Sie müssen Funktionsprototyp ändern:

void add_car (struct Car* cars_fleet) 

So:

void add_car (struct Car** cars_fleet) 

Dann nutzen, in der Funktion:

*cars_fleet = car 

Während im Haupt rufen:

add_car(&cars_fleet); 
+0

erhöhen ja, das funktioniert. Könnten Sie mir helfen zu verstehen, warum diese Syntax funktioniert? cars_fleet ist ein Zeiger, also warum ist es wichtig, so seine Adresse zu senden, und warum muss ich 2 "*" im Prototyp verwenden? –

+0

Im ersten Prototyp Ihrer Funktion war der Zeiger cars_fleet eine Kopie des von Ihnen in main definierten Zeigers, so dass Sie eine Kopie in der Funktion modifiziert haben. In dem neuen Prototyp, den ich eingereicht habe, wird die Adresse des in main definierten Zeigers an die Funktion übergeben, und mit * cars_fleet = car modifizierst du diesen Zeiger. – shrike

+0

'fonction' ->' Funktion', und es gibt kein Konzept von Wert übergeben oder durch Verweis in C übergeben, alles wird durch Wert übergeben;) –

0

Sie sind in add_car zu einer lokalen Variablen zugewiesen wird, ändern:

Car *add_car(void){/* Car *x = malloc(...); ... return x */}; 

Und in main:

Car* cars_fleet = NULL; 
cars_fleet = add_car(); 

Wie soll ich über Links des cars_fleet iterieren, wenn ich nicht tun es an add_car übergeben? und wessen Adresse komme ich zurück? die Adresse die neue cars_fleet mit dem Auto hinzugefügt?

In Ihrer Frage, die Sie ein NULL sind vorbei, so gibt es keine Chance throug Links zu durchlaufen, teilen, verwenden Sie eine Funktion einen neuen Knoten und ein anderes zu erhalten, diese neuen Car in der Liste einzufügen (vorbei an den Schwanz).

+0

Wie soll ich die Links von cars_fleet durchlaufen, wenn ich sie nicht an add_car weitergebe? und wessen Adresse komme ich zurück? die Adresse der neuen cars_fleet mit dem Auto hinzugefügt? –

+0

danke für die antwort. aber es löst mein Problem nicht. Ich weiß, dass es möglich ist, Links zu einer leeren Liste hinzuzufügen, mir fehlten nur ein paar Grundlagen. der Anser oben tut das. nochmal, danke trotzdem. –

+0

Sie sind willkommen, feststellen, dass 'malloc' fehlschlagen kann, Trenn Sie Code verwenden können wie' wenn x = add_car() dann append_car (Schwanz, x) sonst error' –