2016-08-13 2 views
-7

Ich habe Zustand geschrieben in while-Schleife, aber FehlerFehler in in c-Link-Liste Gebäude

curr undeclared (first in dieser Funktion)

auftritt, obwohl ich die Variable Curr in Insert verwendet haben Funktion.

+3

Ihre Formatierung ist grauenhaft. Bitte, für die Liebe zu allem, was gut ist, lies guten C-Code und formatiere deinen Code korrekt und konsistent. Dann können wir Ihnen vielleicht erklären, wie * scope * funktioniert. Aber erst einmal sind deine Blöcke als * Blöcke * sichtbar. –

+0

Beachten Sie, dass die Punkte '.' und Pfeil' -> 'Operatoren sehr eng binden und niemals Leerzeichen auf beiden Seiten haben sollten. Der Compiler stört das nicht, aber für die Vernunft derjenigen, die Ihren Code lesen. (Ich stimme dem Kommentar auch vollkommen zu, dass die gezeigte Formatierung miserabel ist. Vermeide etwas, das [Pico-Stil] ähnelt (https://en.wikipedia.org/wiki/Indent_style#Pico_style) - das ist C, nicht Pico - und benutze Allman oder stattdessen eine 1TBS-Variante.) –

+0

Komm schon, schau dir an, wie die meisten Code-Snippets hier formatiert sind ... – alk

Antwort

5

Wenn Sie eine Variable in C deklarieren, wird sie auf den nächsten umgebenden Block beschränkt.

Zum Beispiel:

if (something) { 
    /* foo is declared here and so it is limited to between these 
    * {} brackets */ 
    int foo = 3; 
    printf("%i\n", foo); 
} 
/* ERROR! foo is not declared here because we are outside the {} */ 
printf("%i\n", foo); 

Ich denke, das Problem ist, dass Sie das Schließen } Klammer zu früh gesetzt haben, während Sie tatsächlich in die Schleife sein innerhalb des Blocks für die sonst-Aussage wollte.

Es würde helfen, wenn Sie die Einrückung des Codes aufgeräumt haben, um die Struktur klarer zu machen. Ich denke, dass es verschiedene andere fehlende Klammern gibt, wie die, um den Anruf zu malloc zu schließen, die den Code daran hindert, kompiliert zu werden.

edit: ich die richtige Version der Funktion denken würde wie folgt aussehen (beachten Sie, ich habe diese abgesehen von dem Kompilieren nicht getestet):

void 
insert (struct node **start) 
{ 
     struct node *temp; 
     temp = (struct node *) malloc (sizeof (struct node)); 
     temp->data = 75; 
     temp->next = NULL; 

     if (*start == NULL) { 
       *start = temp; 
     } 
     else { 
       struct node *curr = *start; 
       while (curr->next != NULL) { 
         curr = curr->next; 
       } 
       curr->next = temp; 
     } 
} 
1

In dieser else-Anweisung

else 
      {struct node *curr=*start;} 

Variable curr hat Geltungsbereich der zusammengesetzten Anweisung, die die Unteranweisung des else ist.

{struct node *curr=*start;} 

So ist es nicht sichtbar und lebendig in dem folgenden while-Anweisung

 while(curr->next!=NULL) 
     {curr= curr->next; 
     curr-> next= temp; 
           } 

Ich glaube, Sie bedeuten, dass die while-Anweisung wird in der zusammengesetzten Anweisung der else-Anweisung enthalten sein.

In jedem Fall ist Ihre Einfügefunktion zu kompliziert. Es kann einfacher geschrieben werden, wie es im Demonstrationsprogramm unten gezeigt wird.

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

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

int insert(struct node **start, int data) 
{ 
    struct node *new_node = malloc(sizeof(struct node)); 
    int success = new_node != NULL; 

    if (success) 
    { 
     new_node->data = data; 
     new_node->next = NULL; 

     while (*start) start = &(*start)->next; 
     *start = new_node; 
    } 

    return success; 
} 

void display(struct node *start) 
{ 
    for (; start; start = start->next) printf("%d ", start->data); 
} 

int main(void) 
{ 
    struct node *start = NULL; 
    const int N = 10; 

    int i = 1; 
    while (i <= N && insert(&start, i)) ++i; 

    display(start); 

    return 0; 
} 

Die Programmausgabe ist

1 2 3 4 5 6 7 8 9 10 

Natürlich können Sie andere Methoden, wie zum Beispiel schreiben müssen das Verfahren, das alle zugewiesenen Speicher für die Liste löscht sich selbst.