2016-04-18 14 views
-2

Dieser Code soll eine einfache verkettete Liste mit Ganzzahlen von 0 bis 20 erstellen. Ich bekomme immer den Fehler: unknown type name 'node', wenn ich meinen Code für was jede Instanz von Knoten im Programm scheint kompilieren. Ich bin mir nicht sicher, ob ich sie definieren muss oder ein größerer Fehler im Code ist.Typedefs und Knoten

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

int main() { 
    int i; 
    struct node *first=NULL; 
    for(i=1;i<=20;i++) 
     first=insertrear(first,i); 
    dispnodes(first); 
    sum(first); 

return 0; 
} 
typedef struct node { 
    int data; 
    struct node *link; 
}; 

node* getnode(node *temp,int i) { 
    temp=(node*)malloc(sizeof(node)); 
    temp->data=i; 
    temp->link=NULL; 
    return temp; 
} 
node* insertrear(node *first,int a) { 
    node *temp=NULL,*i; 
    temp= getnode(temp,a); 
    if(first==NULL) { 
     first=temp; 
     return first; 
    } 

    for(i=first;i->link!=NULL;i=i->link); 
     i->link=temp; 
     return first; 
} 

void dispnodes(node *first) { 
    int j; 
    if(first==NULL) { 
     printf("\nlist empty"); 
     return; 
    } 
    node *i; 
    for(i=first,j=0;i!=NULL;j++,i=i->link) 
     printf("\nNode #%d contains %d ",j,i->data); 
} 

void sum(node *first) { 
    node *i; 
    int total=0; 
    for(i=first;i!=NULL;i=i->link) 
     total+=i->data; 
    printf("\nThe sum total of all nodes in this list is %d",total); 
} 

Antwort

0
typedef struct node { 
    int data; 
    struct node *link; 
}node; 

int main() { 
    int i; 
    struct node *first=NULL; 
    for(i=1;i<=20;i++) 
     first=insertrear(first,i); 
    dispnodes(first); 
    sum(first); 

return 0; 
} 
+0

Andere Dinge müssen auch vor dem Haupt deklariert werden! –

1

entweder Sie benötigen ein Label für die typedef struct Knoten zu spezifizieren oder die Struktur Knoten nicht typedef.

Wie Sie es verwenden, können Sie Folgendes tun.

/* Forward declare typedef _node to node */ 
typedef struct node_ node; 

/* Define struct node_ */ 
struct node_ { 
    int data; 
    node *link; 
}; 

Sie sollten die Vorwärts-Erklärung über Ihre main() haben, so dass man es auch dort nutzen können.

+0

Kollidiert "struct _node" mit C11 7.1.3 Reservierte Bezeichner: "Alle Bezeichner, die mit einem Unterstrich beginnen, sind immer für die Verwendung als Bezeichner mit dem Dateibereich sowohl im normalen als auch im Tag-Namensraum reserviert."? – chux

+0

@chux, sieht so aus. Ich habe die Antwort bearbeitet. – ronakg

0

Es gibt zwei Dinge, die Sie haben zu ändern:

  1. Sie die struct zu erklären haben, typedef und alle Funktionen, die Sie anrufen, bevor main function.Compiler sollte mit der Erklärung zur Verfügung gestellt werden, bevor es trifft jeder von ihnen.

  2. Auch haben Sie kein Label auf die typedef vorgesehen node zu strukturieren, können Sie etwas tun:

    typedef struct node { 
        int data; 
        struct node *link; 
    } Node ; 
    

    oder verwenden struct node statt node eine Variable struct node Typs zu deklarieren

Hier ist der Code nach der Änderung:

typedef struct node 
{ 
    int data; 
    struct node *link; 
} Node ; 

void dispnodes(Node *first); 
node* insertrear(Node *first,int a); 
void sum(Node *first); 

int main() { 
    int i; 
    struct node *first=NULL; 
    for(i=1;i<=20;i++) 
     first=insertrear(first,i); 
    dispnodes(first); 
    sum(first); 

    return 0; 
} 
// rest of the code