2017-04-26 6 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

'printStack()'는'tmp'를 정의하지만, 그것을 사용하지 마십시오. 대신에'head'를 수정하면'head'는 쓸모가 없습니다. –

+0

@WeatherVane 또한 pop() 함수에서이 작업을 수행했습니다. 둘 다 변경 한 후에 무한 루프가 사라졌습니다. 감사합니다! – mychem97

+0

그러나 printstack()에 의해 수정 된 전역 변수와는 달리 pass by value 매개 변수를 수정 했으므로'pop (node ​​* head)'에서 괜찮 았습니다. – bruceg

답변

1

변수를 제대로 초기화하지 않아 무한 루프가 발생합니다. 특히 노드 * head가 NULL로 초기화되거나 toBin()의 int 변수가 0으로 초기화된다는 보장이 없습니다.

언제나 항상 항상은 C/C++로 프로그래밍 할 때 변수를 초기화합니다.

이 버그를 수정하고 사용되지 않는 코드를 제거가 우리에게 나뭇잎에서

#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; 
}