2016-11-20 1 views
-3

In der folgenden Funktion. Ich habe versucht, Stack zu verwenden und mit Arrays zu implementieren. Ich machte create stack, push, pop, Funktionen. Aber beim Kompilieren zeigt sich ein Fehler. Bitte helfen Sie mir herauszufinden, was das Problem ist?Was ist der Fehler im Code?

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

struct stack_struct { 
    char a[100]; 
    int top; 
}; 

typedef struct stack_struct *stack; 

stack charc; 

stack createstack() { 
    stack s = (stack) malloc(sizeof(struct stack_struct)); 
    s->top = -1;//initialize the stack 
    return s; 
} 

void push(stack s, char x) { 
    s->top++; 
    s->a[s->top] = x; 
} 

char pop(stack s) { 
    assert(s->top > 0); 
    char x; 
    x = s->a[s->top]; 
    s->top--; 
    return x; 
} 

void printstack(stack s) { 
    while (s->top != -1) { 
     printf("%c", s->a[s->top]); 
     s-> top--; 
    } 


void main() { 
    charc = createstack();  
    push(charc, 3); 
    printstack(charc); 
    pop(charc); 
    printstack(charc); 
    push(charc, 4); 
    printstack(charc); 
    push(charc, 5); 
    printstack(charc); 
    push(charc, 6); 
    printstack(charc); 
    push(charc, 7); 
    printstack(charc); 
} 
} 
+1

Was ist der Fehler und die Zeilennummer? –

+0

Wahrscheinlich nicht verwandt, aber Sie sollten 'malloc' nicht werfen – UnholySheep

+0

Verbergen von Zeigern mit' typedef' ist fehleranfällig, als schlechte Praxis, macht Code schwerer zu lesen ... – chqrlie

Antwort

3

Sie fehlen } am Ende der Print Funktion und haben einen zusätzlichen } am Ende des Codes. Füge das fehlende hinzu und lösche das Extra und es wird kompiliert. Auch Ihre Hauptfunktion sollte int (int main() statt void main()) zurückkehren, und Sie sollten return 0; von Ihrer Hauptfunktion

+0

Ich habe gelernt, dass Rückkehr 0; ist am Ende nicht notwendig. und auch nachdem du das getan hast (was du mir gesagt hast) zeigt es Pop; Assert-Funktion schlägt fehl. – 4rshdeep

+0

Das liegt daran, dass Ihre Printstack-Funktion Ihren Stack effektiv leert, so dass 's-> top 'auf -1 gesetzt ist. Assert schlägt fehl, weil 's-> top 'nicht größer als' 0 'ist. Und obwohl Ihr Programm mit 'void main()' compiliert, sollten Sie es nicht tun, der richtige Weg ist 'int main()' oder 'int main (int argc, char * argv [])'. –

1

Es gibt in der Tat Probleme im Code:

  • Es gibt eine fehlende } am Ende die Funktionsdefinition für printstack

  • da Sie eine zusätzliche } am Ende der Datei haben, nach der Definition von main() und da gcc ermöglicht die lokale func Bei der Definition von Definitionen ist die Fehlermeldung wahrscheinlich sehr schwer zu interpretieren.

  • Die Assertion in pop sollte assert(s->top >= 0); lesen, da s->top == 0 einen Stapel mit einem Element vorhanden anzeigt.

  • Der Prototyp für main sollte entweder int main(void) oder int main(int argc, char *argv[]) oder gleichwertig sein. Die Rückgabe 0 am Ende der main() ist optional in C99 und später, aber als guter Stil.

  • Der Rückgabewert von malloc() ist unnötig und kann einige Probleme verbergen, wenn Sie <stdlib.h> weglassen, nicht in C-Code.

  • Das Verstecken von Hinweisen hinter typedef s wird nicht empfohlen, da es den Code schwerer lesbar macht und oft zu Programmierfehlern führt. A stack ist ein Objekt, nicht ein Zeiger auf ein Objekt. Die Verwendung von impliziten Zeigern macht den Unterschied weniger offensichtlich und schafft Verwirrung.

  • printstack soll die stack nicht ändern, sollte es eine lokale Variable verwenden:

    void printstack(const struct stack_struct *s) { 
        for (int i = s->top; i >= 0; i--) { 
         printf("%c", s->a[i]); 
        } 
        printf("\n"); 
    } 
    
  • globale Variablen verwenden ist nicht für den Code erforderlich, charc lokal auf die main Funktion machen und free es vor dem Verlassen Programm.

  • Der Stapelelementtyp sollte int anstelle von char sein, da Sie Zahlen auf den Stapel schieben. Hier

ist eine vereinfachte Version:

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

typedef struct stack { 
    int a[100]; 
    int top; 
} stack; 

stack *createstack(void) { 
    stack *s = malloc(sizeof(*s)); 
    s->top = -1; // initialize the stack as empty 
    return s; 
} 

void push(stack *s, int x) { 
    s->a[++s->top] = x; 
} 

int pop(stack *s) { 
    assert(s->top >= 0); 
    return s->a[s->top--]; 
} 

void printstack(const stack *s) { 
    for (int i = s->top; i >= 0; i--) { 
     printf("%d ", s->a[i]); 
    } 
    printf("\n"); 
} 

int main(void) { 
    stack *st = createstack(); 

    push(st, 3); 
    printstack(st); 
    pop(st); 
    printstack(st); 
    push(st, 4); 
    printstack(st); 
    push(st, 5); 
    printstack(st); 
    push(st, 6); 
    printstack(st); 
    push(st, 7); 
    printstack(st); 

    free(st); 
    return 0; 
} 
+0

sir es zeigt nicht die ganzen Zahlen was soll ich tun? @chqrlie – 4rshdeep

+0

@pottersher: Ich habe die Antwort mit einigen Korrekturen aktualisiert und benutze 'int' als Elementtyp, um den Stapelinhalt druckbar zu machen. – chqrlie