2017-02-12 3 views
0

Ich denke, da ist etwas falsch mit meinem erstellen.Wie kann ich die Daten anzeigen, die ich in einer verknüpften Liste erstellt habe?

void add(N *p) { 
    N *current, *start; 
    current = malloc(sizeof(p)); 
    scanf("%d", &current->data); 
    current->next = NULL; 

    if (p == NULL) { 
     p = current; 
     start = current; 
    } else { 
     start->next = current; 
     start = current; 
    } 
} 

Ich denke, dass meine display() korrekt ist.

void display(N *p) { 
    N *current; 
    current = p; 
    while (current != NULL) { 
     printf("\n%d", current->data); 
     current = current->next; 
    } 
} 
+0

welche Fehler bekommen Sie? Was ist die gewünschte Ausgabe? Was ist dein aktueller Output? – Yousaf

+0

nichts ausgeben ... wenn ich 1 dann das Programm stop process return 0 – Willy

+0

Ich habe versucht, dass malloc (sizeof (N)). Die Ausgabe ist gleich. – Willy

Antwort

0

Es gibt Probleme:

  • Funktion add() nicht die richtige Menge an Speicher zuordnet. Verwenden Sie diese Methode:

    current = malloc(sizeof(*current)); 
    
  • Die Art und Weise Sie das neu zugewiesene Objekt in die Liste einfügen, funktioniert nicht: Sie p ändern, das ist ein Argument, mit lokalen Bereich, und Sie setzen start die auch lokalen Bereich hat. Es wird keine Nebenwirkung auf den N Zeiger des Anruferbereichs ausgeübt.

  • Ihre display Funktion ist korrekt, aber ich würde das Hinzufügen der Newline am Ende der Ausgabe statt am Anfang bevorzugen.

Hier ist eine aktualisierte Version mit einer besseren API:

int add(N **headp) { 
    N *current = calloc(sizeof(*current)); 
    if (current == NULL) { 
     fprintf(stderr, "cannot allocate memory for new object\n"); 
     return -1; 
    } 
    if (scanf("%d", &current->data) != 1) { 
     fprintf(stderr, "cannot read value for new object\n"); 
     return -2; 
    } 
    current->next = *headp; 
    *headp = current; 
    return 0; 
} 

void display(const N *list) { 
    for (const N *p = list; p != NULL; p = p->next) { 
     printf("%d\n", p->data); 
    } 
} 

Die add Funktion auf diese Weise von dem Anrufer verwendet wird:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct N { 
    int data; 
    struct N *next; 
} N; 

int main(void) { 
    N *list = NULL; 

    for (i = 0; i < 10; i++) { 
     if (add(&list)) 
      break; 
    } 
    display(list); 
    return 0; 
} 
+0

Danke. .... – Willy

+0

ich habe gerade herausgefunden head = add (head); Es klappt. Danke für die Tipps. int main() { N * Kopf = NULL; head = add (head); Anzeige (Kopf); Rückgabe 0; } – Willy

+0

@Willy: 'head = add (head);' ist nicht so mächtig wie 'add (& head)', um Fehler zu erkennen. 'add (& head)' könnte einen booleschen Wert zurückgeben, der Erfolg anzeigt, oder ein "int", das einen Fehlercode anzeigt.Ich habe den Code aktualisiert, um diese Möglichkeit zu verdeutlichen. – chqrlie

1

Ihre malloc(sizeof(p)) gibt nur genug Platz für einen Zeiger. Sie möchten stattdessen malloc(sizeof(N)).

Außerdem müssen Sie den neuen Wert zurückgeben, anstatt ihn am Ende von add() wegzuwerfen. (Ihre start hat ein ähnliches Problem, ein Pick der Kopf der verknüpften Liste zu sein.)

+0

okay, ich habe es. Wie wäre es mit meinem Display? Stimmt irgendetwas nicht? – Willy

+0

@Willy Ihr 'display()' sieht gut aus. Es ist deine 'add()', die Probleme hat. – chrisaycock

Verwandte Themen