2017-04-26 19 views
0

プログラムは、ユーザが整数を入力し、単一リンクリストをスタックにバイナリに変換することになっています。私はそれが私のtoBin()関数か、無限ループの原因となっている私のprintStack()関数だと思います。無限ループを解くことができません

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

typedef struct node_def node; 

struct node_def 
{ 
    int val; 
    node *next; 
}; 

node *head; 

void push(int val); 
void pop(node *head); 
int top(); 
void printStack(); 
int toBin(int val); 

int main() 
{ 
    int num = 0; 

    printf("Enter an integer: "); 
    scanf("%d", &num); 
    push(num); 
    toBin(num); 
    printStack(); 

    return 0; 

} 

void push(int val) 
{ 
    node *new; 
    new = malloc(sizeof(node)); 

    if (head == NULL) 
    { 
     head = malloc(sizeof(node)); 
     head->next = NULL; 
     head->val = val; 
    } 
    else 
    { 
     new->next = head; 
     new->val = val; 
     head = new; 

    } 

    return; 
} 

void pop(node *head) 
{ 
    node *tmp; 
    if(head == NULL) 
    { 
     printf("Stack is Empty\n"); 
     return; 
    } 
    else 
    { 
     tmp = head; 
     head = head->next; 
     free(tmp); 
    } 
    return; 
} 

int top() 
{ 
    return(head->val); 
} 

void printStack() 
{ 
    node *tmp; 
    tmp = head; 

    if(head == NULL) 
    { 
     return; 
    } 

    while(head != NULL) 
    { 
     printf("%d ", head->val); 
     head = head->next; 
    } 
    printf("\n"); 
    return; 
} 

int toBin(int val) 
{ 
    pop(head); 
    int i = 1, remainder, binary; 

    while(val != 0) 
    { 
     remainder = val % 2; 
     binary = binary + remainder * i; 
     val = val/2; 
     i = i * 10; 
     push(binary); 
    } 

    return val; 
} 
+1

)'は 'tmp'を定義し、それを使用しないでください。代わりに、グローバルな 'head'を修正してから、' head'は役に立たないのです。 –

+0

@WeatherVane私もpop()関数でこれを行いました。両方を変更した後、無限ループがなくなった、ありがとう! – mychem97

+0

しかし、printStack()によって変更されたグローバル変数ではなく、値渡しのパラメータを変更していたので、 'pop(node * head)'でOKでした。 – bruceg

答えて

1

変数が正しく初期化されていないため、無限ループが発生します。特に、ノード*頭部がNULLに初期化されるか、toBin()のint変数がゼロに初期化されるという保証はありません。

常に、常に、常には、C/C++でプログラミングするときに変数を初期化します。

これらのバグを修正し、未使用のコードを削除はで私たちを残します: `printStack(で

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

typedef struct node_def node; 

struct node_def 
{ 
    int val; 
    node *next; 
}; 

/* Note that we are initialising the global variable to NULL. */ 
node *head = NULL; 

void push(int val); 
void printStack(); 
int toBin(int val); 

int main() 
{ 
    int num = 0; 

    printf("Enter an integer: "); 
    scanf("%d", &num); 

    /* Removed push(num), as you're using parameters in the following call: */ 
    toBin(num); 
    printStack(); 

    return 0; 

} 

/* Changed printStack to use a tmp pointer to 
    traverse the stack without mutating it */ 
void printStack() 
{ 
    node* tmp = head; 
    while(tmp != NULL) 
    { 
     printf("%d ", tmp->val); 
     tmp = tmp->next; 
    } 
    printf("\n"); 
    return; 
} 

int toBin(int val) 
{ 
    /* Removed pop() as you're getting val from parameters */ 

    /* Also initialising remainder and binary variables */ 
    int i = 1, remainder = 0, binary = 0; 

    while(val != 0) 
    { 
     remainder = val % 2; 
     binary = binary + remainder * i; 
     val = val/2; 
     i = i * 10; 
     push(binary); 
    } 

    return val; 
} 

/* It's a stack so no if's are necessary for pushing */ 
void push(int val) 
{ 
    node *new = malloc(sizeof(node)); 
    new->val = val; 
    new->next = head; 

    head = new; 
    return; 
} 
関連する問題