2016-04-01 12 views
0
#include "stdio.h" 
#include "stdlib.h" 

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

struct stack_type{ 
    node_type *top; 
    int length; 
}; 

void push(node_type *head,stack_type stack); 

int main() 
{ 
    struct stack_type stack; 
    node_type *list; 
    list = (node_type *)malloc(sizeof(node_type)); 
    list->next = NULL; 
    node_type *head; 
    head = list; 
    stack.length = 0; //set stack empty 
    push(head, stack); 
    list = head->next; 
    printf("The entegers are:"); 
    do { 
     printf("%d", stack.top->data); 
     list = list->next; 
     stack.top = list; 
    } while (list->next != 0); 
    system("pause"); 
    return 0; 
} 

void push(node_type *head,stack_type stack) 
{ 
    int i, n; 
    node_type *p; 
    p = (node_type*)malloc(sizeof(node_type)); 
    p = head; 
    printf("Enter the integers(0 to end):"); 
    for (;;) { 
     scanf("%d", &n); 
     if (n == 0) 
      break; 
     stack.top->data = n; 
     p->next = stack.top; 
     stack.length++; 
    } 
} 

wenn ich debugge, sagte es, dass p-> next = NULL und zu stoppen, bin ich nicht klar darüber.verkettete Listen Implementierung des Stapels

warum ich falsch? Wie es zu beheben ist, bin ich nicht klar über die Verwendung von NULL und Top Finger Vielen Dank für die Antworten im Voraus.

+0

In dem spezifischen Abschnitt aussehen deklariert werden sie stoppt? – Ajay

+2

c oder C++? wähle eins. – Magisch

+0

Dies ist kein richtiger Stack-Betrieb .... Die korrekte Implementierung des Stacks sollte sein: Es sollte eine "push (item, top)" -Funktion geben, um die Elemente zu drücken und "pop (top)" -Funktion, um die Elemente zu zeigen – Shiv

Antwort

3

zwei Probleme: Erstens in der main Funktion Sie nicht initialisieren stack.top was bedeutet, es wird eine unbestimmt Wert, dereferencing diese scheinbar zufälligen Zeiger haben, wie Sie in der push Funktion tun-undefinierten Verhalten führen.

Das zweite Problem ist, dass Sie die stack Struktur pushvon Wert, übergeben, was bedeutet, dass es kopiert wird und alle in der push Funktion vorgenommenen Änderungen nur auf der lokalen Kopie der Struktur durchgeführt. Sie müssen mit dem Wert übergeben, indem Sie Zeiger und den Adressenoperator & verwenden.

2

Das Programm macht keinen Sinn.

Es ist geschrieben C-Konstruktionen geschrieben, aber wie ein C++ - Programm kompiliert.

Funktion push ist völlig falsch.

void push(node_type *head,stack_type stack) 
{ 
    int i, n; 
    node_type *p; 
    p = (node_type*)malloc(sizeof(node_type)); 
    p = head; 
    //... 

Der Stapel wird als Wert akzeptiert. Daher wird der ursprüngliche Stapel nicht geändert. Es liegt ein Speicherverlust vor, da der Zeiger p nach dem Zuweisen von Speicher neu zugewiesen wird. Datenelement top des Objekts stack wurde nicht initialisiert. Also diese Aussage

führt zu undefiniertem Verhalten des Programms.

Zunächst sollten Sie Ihr Programm als C-Programm kompilieren. In diesem Fall meldet der Compiler zahlreiche Fehler, da die Namen node_type und stack_type nicht deklariert sind. So auch die zweite Strukturdeklaration ist ungültig

struct stack_type{ 
    node_type *top; 
    ^^^^^^^^^^^^^^ 
    int length; 
}; 

Es sollte mindestens wie

void push(struct stack_type *stack, int data); 

Es sollte nicht nur eine Sache zu erklären

struct stack_type{ 
    struct node_type *top; 
    ^^^^^^^^^^^^^^^^ 
    int length; 
}; 

Funktion push sein muss: drücken Sie die vakue von data im Stapel.

berücksichtigen, dass die Funktion Haupt ohne Parameter werden wie

int main(void) 

Die Definition der Funktion push kann die folgende Art und Weise

void push(struct stack_type *stack, int data); 

int main(void) 
{ 
    struct stack_type stack = { NULL, 0 }; 

    //... 

    int data; 

    while (scanf("%d", &data) == 1 && data != 0) 
    { 
     push(&stack, data); 
    } 
    //... 
} 

void push(struct stack_type *stack, int data) 
{ 
    struct node_type *node = malloc(sizeof(struct node_type)); 

    if (node != NULL) 
    { 
     node->data = data; 
     node->next = stack->top; 
     stack->top = node; 
     ++stack->length; 
    } 
} 
+0

Aber ich muss eine verkettete Liste verwenden, um den Stapel zu implizieren. –

+0

@jesse 左 Ich habe nicht verstanden, was du sagen wolltest. Ich habe dir sogar die Funktion Push-Implementierung gezeigt. Sie müssen also den Code in meinem Beitrag kopieren und einfügen. –

Verwandte Themen