2017-06-11 1 views
1
#include<stdio.h> 
#include<stdlib.h> 
#include<stdbool.h> 
typedef struct node 
{ 
    char data; 
    struct node* link; 
} STACK_NODE; 

void insert(STACK_NODE** p); 
void print(STACK_NODE** p); 
bool push(STACK_NODE** p, char in); 
bool pop(STACK_NODE** p, char* out); 

int main() 
{ 
    STACK_NODE* myStackTop; 
    insert(&myStackTop); 
    print(&myStackTop); 
    return 0; 
} 

void insert(STACK_NODE** p) 
{ 
    char mychar; 
    int NC,k; 
    bool Mem; 
    printf("how many charachters do you want to put in stack:"); 
    scanf("%d",&NC); 
    for(k=0;k<NC;k++) 
    { 
     printf("enter character:-"); 
     scanf(" %c",&mychar); 

     Mem=push(p,mychar); 
     if(!Mem) 
     { 
      printf("ran out of memory or unknown error"); 
      exit(100); 
     } 
    } 
} 

bool push(STACK_NODE** p,char c) 
{ 
    STACK_NODE* newNode; 
    bool success; 
    newNode = (STACK_NODE*)malloc(sizeof(STACK_NODE)); 
    if(!newNode) 
    { 
     success = false; 
    } 
    else 
    { 
     newNode->data=c; 
     newNode->link=*p; 
     *p=newNode; 
     success = true; 
    } 
    return success; 
}  

void print(STACK_NODE** p) 
{ 
    char out; 
    printf("contents of the stack:"); 
    while(pop(p,&out)) 
    { 
     printf("%c",out); 
    } 
    return; 
} 

bool pop(STACK_NODE** p,char* c) 
{ 
    STACK_NODE* Ndel; 
    bool success; 
    if(*p) 
    { 
     success = true; 
     *c=(*p)->data; 
     Ndel= *p; 
     *p = (*p)->link; 
    } 
    else 
     success = false; 
    return success; 
} 

Le programme entier fonctionne correctement jusqu'à ce que le dernier élément soit retiré de la pile et imprimé. le programme se bloque après l'impression du dernier caractère. J'ai essayé de le déboguer en plaçant des instructions supplémentaires dans la définition de la méthode print() après le bloc while. Je pense que le problème est avec l'instruction if (* p) dans la définition de la fonction pop(). J'ai vérifié les solutions. Mais rien n'a fonctionné.Le programme se bloque après le dernier élément de la pile

+0

BTW, en C, il est * pas * besoin de jeter le résultat de 'malloc()' & Friends, ni recommandé de * aucune façon *. – alk

Répondre

3

Vous devez initialiser votre pile NULL

int main() 
{ 
    STACK_NODE* myStackTop = NULL; 

Si vous n'êtes pas, vous allez utiliser une valeur non initialisée lorsque vous pop le dernier élément.

BTW: En pop il semble que vous avez oublié un free(Ndel);

+0

Merci .. il a travaillé .. –

+0

Oui..J'ai oublié de libre (Ndel). –