2010-04-10 56 views
0

錯誤在哪裏?這個堆棧實現的問題

我在這裏的代碼:

typedef struct _box 
    { 
     char *dados; 
     struct _box * proximo; 
    } Box; 

    typedef struct _pilha 
    { 
     Box * topo; 
    }Stack; 

void Push(Stack *p, char * algo) 
{ 
    Box *caixa; 
    if (!p) 
    { 
     exit(1); 
    } 

    caixa = (Box *) calloc(1, sizeof(Box)); 
    caixa->dados = algo; 
    caixa->proximo = p->topo; 
    p->topo = caixa; 
} 


char * Pop(Stack *p) 
{ 
    Box *novo_topo; 
    char * dados; 
    if (!p) 
    { 
     exit(1); 
    } 

    if (p->topo==NULL) 
     return NULL; 

    novo_topo = p->topo->proximo; 

    dados = p->topo->dados; 

    free(p->topo); 
    p->topo = novo_topo; 

    return dados; 
} 


void StackDestroy(Stack *p) 
{ 
    char * c; 
    if (!p) 
    { 
     exit(1); 
    } 
    c = NULL; 
    while ((c = Pop(p)) != NULL) 
    { 
     free(c); 
    } 
    free(p); 
} 

int main() 
{ 
int conjunto = 1; 
char p[30], * v; 
int flag = 0; 

Stack *pilha = (Stack *) calloc(1, sizeof(Stack)); 

FILE* arquivoIN = fopen("L1Q3.in","r"); 
FILE* arquivoOUT = fopen("L1Q3.out","w"); 

if (arquivoIN == NULL) 
{ 
    printf("Erro na leitura do arquivo!\n\n"); 
    exit(1); 
} 

fprintf(arquivoOUT,"Conjunto #%d\n",conjunto); 

while (fscanf(arquivoIN,"%s", p) != EOF) 
{ 
    if (pilha->topo == NULL && flag != 0) 
    { 
     conjunto++; 
     fprintf(arquivoOUT,"\nConjunto #%d\n",conjunto); 
    } 

    if(strcmp(p, "return") != 0) 
    { 
     Push(pilha, p); 
    } 

    else 
    { 
     v = Pop(pilha); 

     if(v != NULL) 
     { 
      fprintf(arquivoOUT, "%s\n", v); 
     } 
    } 
    flag = 1; 
} 

StackDestroy(pilha); 

return 0; 

}

pop函數返回從文件中讀取字符串值。 但是不正確,我不知道爲什麼。

+2

雖然有人可能會發現問題,但如果包含一些細節,例如程序的「不正確」,您看到什麼故障,您嘗試過修復它,等等。 – RarrRarrRarr 2010-04-10 06:39:36

回答

3

您沒有爲dados指向的字符串分配任何存儲空間 - 您只是重新使用一個字符串緩衝區(p)並傳遞它,因此所有堆棧元素都指向這一個字符串。

+1

是的,確切地說。您在堆棧中存儲的Box對象包含'char *'指針 - 它們本身並不包含這些字符串。所以,你創建一個推送到堆棧上的'Box',它指向'p'的位置,然後在讀取下一個值時改變'p',並且由於已經在堆棧上的'Box'仍然指向'p',它現在指向已更改的值。 – 2010-04-10 06:47:40

+1

天啊! 非常感謝你! = D 我已經花了很多時間用這個問題,一定是缺乏咖啡因=) – 2010-04-10 07:12:14