2011-01-16 13 views
0

Ich habe eine Verknüpfte Liste erstellt. Seine Elemente behalten die Adresse der vorherigen und nächsten Elemente. Er erhält Befehle aus einer Eingabedatei. Es erkennt den Befehl und verwendet die folgende Anweisung als Parameter. (Text: add_to_front john -> bedeutet: add_to_front(john))Eingabe in C mit verknüpften Listen lesen

Code: http://pastebin.com/KcAm1y3L

Wenn ich versuche, die Befehle aus einer Eingabedatei zu geben, es gibt mir gleiche Leistung über und über. Wenn ich jedoch Eingaben in main() manuell schreibe, funktioniert es.

Für die Ex-Eingabedatei:

add_to_front john 
add_to_back jane 
add_to_back jane 
print 

(leider) die Ausgabe:

>add_to_front john 
>add_to_back jane 
>add_to_back jane 
>print 
jane 
jane 
jane 

Obwohl, wenn ich

add_to_front(john); 
add_to_back(jane); 
add_to_back(jane); 
print(); 

Anstelle dieser Befehl Scheck:

while (scanf("%s",command)!=EOF) 
{ 
    if (strcmp(command,"add_to_front")==0) 
    { 
     gets(parameter); 
     add_to_front(parameter); 
    } 
    else if (strcmp(command,"add_to_back")==0) 
    { 
     gets(parameter); 
     add_to_back(parameter); 
    } 
    else if (strcmp(command,"remove_from_back")==0) 
     remove_from_back(parameter); 
    ... 
     printf(" HUH?\n"); 
    } 
} 

In main() gibt es die richtige Ausgabe.

Ich weiß, es ist eine Menge zu fragen, aber diese Sache stört mich für 2 Tage. Was denkst du, mache ich falsch?

+3

Verwenden Sie nicht 'gets()', auch im Testcode! ** NIE ** benutzen 'gets()'! –

+0

Debuggen Sie es (mit einem Debugger ...)! – Drakosha

Antwort

2

Sie zeigen den obigen Code nicht an. Höchstwahrscheinlich kopieren Sie die Daten, die in Ihre Liste gelesen wurden, nicht, so dass Sie den letzten überschriebenen Wert speichern und immer und immer wieder.


auf dem Code in der Paste ist die Suche, das ist in der Tat das Problem; Sie kopieren die Zeichenfolgen nicht in Ihre Liste - Sie kopieren einfach den Zeiger. Sie müssen Code hinzufügen, um Speicherplatz für die Zeichenfolge zuzuweisen und die Zeichenfolge zu kopieren. Wenn es für Sie verfügbar ist, erledigt die Funktion strdup() die Aufgabe sauber. Wenn nicht, können Sie leicht Ihre eigenen schreiben. Beachten Sie, dass Sie den zugewiesenen Speicherplatz ebenfalls freigeben müssen.

+1

@gcx: selbst nach der Korrektur des Kopierens der Daten bleibt noch etwas Arbeit übrig. Die Funktionen "Vorder-/Rückseite prüfen" haben das gleiche Etikett, aber die Vorderseite des Schecks wird von der Rückseite bedruckt, und die Rückseitendrucke werden von vorne gedruckt. Ich habe ein plausibel aussehendes "d_free()" implementiert, aber die Dinge werden immer noch verdreht, wenn man genug hinzufügt, freigibt und druckt. Sie sollten genau hinsehen, ob "baslangic" benötigt wird und warum. Es könnte besser sein, eine zirkular doppelt verkettete Liste mit einem Dummy-Knoten zu pflegen, der beim Start initialisiert wird. –