2016-08-21 4 views
0

Ich bin neu in verknüpften Listen, aber ich versuche, eine verknüpfte Liste mit 3 Elementen zu erstellen und eine Funktion zu schreiben, die die Anzahl der Elemente in der verknüpften Liste zählt. Ich bekomme immer einen Segmentierungsfehler, aber ich kann nicht herausfinden warum. Jede Hilfe wäre sehr willkommen.Segmentierungsfehler beim Zählen von Elementen in der verknüpften Liste

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

typedef struct node {  // create a struct to build a 
    int    data;  // linked list 
    struct node* next; 
}; 

struct node* BuildOneTwoThree() { 
    struct node* head = NULL;   // pointers 
    struct node* second = NULL;  // for 
    struct node* third = NULL;   // linked list 

    // allocate memory on the heap for the 3 nodes 
    head = malloc(sizeof(struct node)); 
    second = malloc(sizeof(struct node)); 
    third = malloc(sizeof(struct node)); 

    head->data = 1;  // set up 1st node 
    head->next = second; 

    second->data = 2;  // set up 2nd node 
    second->next = third; 

    third->data = 3;  // set up 3rd node 
    third->next = NULL; 

    return head; 

} 

void main(){ 
    int num = Length(BuildOneTwoThree); 
    printf("Number of nodes:%d\n", num); 

} 

int Length(struct node* head) { 
    struct node* current = head;  
    int count = 0; 

    while(current != NULL) { 
     count++; 
     current = current->next;  
    } 
    return count; 
} 
+2

Führen Sie es in einem Debugger und sehen Sie, wo es fehlerhaft ist. –

Antwort

3

Die Linie

int num = Length(BuildOneTwoThree); 

benötigt

int num = Length(BuildOneTwoThree()); 
           ^^^ Missing the function call. 

Ohne dass sein, Sie sind die Funktionszeiger auf Length Justing.

Sie können solche Fehler vermeiden, indem Sie vor der Verwendung von Funktionen Deklarationen von Funktionen bereitstellen.

struct node* BuildOneTwoThree(); 
int Length(struct node* head); 

Mit den Funktionen am Anfang der Datei erklärt, erhalte ich die folgende Meldung von gcc:

soc.c: In function ‘main’: 
soc.c:36:22: warning: passing argument 1 of ‘Length’ from incompatible pointer type [-Wincompatible-pointer-types] 
    int num = Length(BuildOneTwoThree); 
        ^
soc.c:10:5: note: expected ‘struct node *’ but argument is of type ‘struct node * (*)()’ 
int Length(struct node* head); 

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

ist nicht richtig. Das erzeugt den nutzlosen Speicherklassenspezifizierer in der leeren Deklaration Warnung. Das muss entweder

struct node { 
    int    data; 
    struct node* next; 
}; 

oder

struct node { 
    int    data; 
    struct node* next; 
} node; 

auch sein, der Rückgabetyp von main Bedürfnisse int sein, nicht void.

+0

Wenn ich es in einem Debugger ausgeführt habe, war das die Zeile, die den Seg-Fehler verursachte. Ich bekomme auch eine Warnung, die ich nicht verstehe: Warnung: nutzlose Speicherklasse Spezifizierer in leere Deklaration [standardmäßig aktiviert] }; ^ –

+0

So scheint es, dass die Warnung, die der Compiler gab, sein soll, wenn ich etwas definiere, aber es nie deklariere. Allerdings deklarierte ich 3 Knoten, die ich zuvor definiert hatte. Das macht mich denken, dass ich solche Knoten nicht erklärt habe ?? :/ –

2

Sie müssen diese Zeile ändern in ‚main‘

int num = Length(BuildOneTwoThree); 

zu

int num = Length(BuildOneTwoThree()); 

Derzeit Compiler sollte einen Fehler werfen, wenn Sie diese Datei kompilieren als die ‚Länge‘ Funktion erwartet ein 'struct node *', aber Sie übergeben es einen Funktionszeiger.

+0

Der Compiler schien damit einverstanden: / –

Verwandte Themen