Frage

Ich versuche, für eine Zuweisung einer einfach verketteten Liste von einer Eingabetextdatei zu erstellen. Ich versuche, es ein wenig zu einer Zeit zu tun, damit ich meinen Code weiß nicht abgeschlossen ist. Ich habe versucht, die Schaffung der Kopfzeiger und nur seinen Wert Ausdrucken und ich kann nicht einmal, dass an die Arbeit, aber ich bin mir nicht sicher, warum. Ich schloss die Struktur, meine Liste erstellen, und Listenfunktionen drucken. Ich habe beinhalten nicht die geöffnete Datei, da dieser Teil funktioniert.

typedef struct List
{
   struct List *next;   /* pointer to the next list node */
   char *str;           /* pointer to the string represented */
   int count;           /* # of occurrences of this string */
} LIST;

LIST *CreateList(FILE *fp) 
{
    char input[LINE_LEN];
    LIST *root;             /* contains root of list             */
    size_t strSize;         
    LIST *newList;          /* used to allocate new list members */

    while (fscanf(fp, BUFFMT"s", input) != EOF) {

        strSize = strlen(input) + 1;

        /* create root node if no current root node */
        if (root == NULL) {
            if ((newList = (LIST *)malloc(sizeof(LIST))) == NULL) {
                printf("Out of memory...");
                exit(EXIT_FAILURE);
            } 
            if ((char *)malloc(sizeof(strSize)) == NULL) {
                printf("Not enough memory for %s", input);
                exit(EXIT_FAILURE);
            }
                memcpy(newList->str, input, strSize);   /*copy string    */
                newList->count = START_COUNT;
                newList->next = NULL;
                root = newList;
        }
    }
        return root;
}

/* Prints sinly linked list and returns head pointer */
LIST *PrintList(const LIST *head) 
{
    int count;

    for (count = 1; head != NULL; head = head->next, head++) {
        printf("%s    %d", head->str, head->count);
    }                       
    return head;     /* does this actually return the start of head ptr, b/c I want to 
                            return the start of the head ptr. */
}
War es hilfreich?

Lösung

root hat einen nicht definierten Wert, so wird es nicht initialisiert werden. Die zweite Zeile von CreateList sein sollte

LIST *root = NULL;

Auch weiter unten gibt es Zuweisung offenbar für die Details des Artikels, aber a) nicht der Code der Zuordnung zu erfassen und speichern Sie es überall, und b) die Größe der Zuordnung sollte strSize sein, nicht die Länge der Variable selbst. Es gibt mehrere Möglichkeiten, es zu beheben, aber die einfachste wäre:

newList->str = (char *)malloc(strSize);
if (newList->str == NULL)

Andere Tipps

Der zweite malloc zuordnet Speicher, aber der Rückgabewert ist etwas nicht zugeordnet, so dass zugewiesene Speicher verloren.

newList zugeordnet, aber nicht initialisiert, so eine Memcpy zu kopieren Speicher mit bis newList-> str wird seit newList-> str Punkte zu nichts scheitern. Wahrscheinlich wollte man das Ergebnis der zweiten malloc newList-> str zugewiesen werden, aber man hätte es vergessen.

Sie sollten nicht den Kopf nach head = head->next in der for-Schleife werden erhöht wird. Druck wird NULL zurückgeben, jedes Mal, da die Schleife nicht aufhören, bis der Kopf NULL ist. Warum müssen Sie den Kopf der Liste zurückzukehren, die Sie nur an die Funktion überhaupt?

Edit:

LIST *current = head;
while (current != NULL) {
    printf("%s    %d", current->str, current->count);
    current = current->next;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top