2017-02-12 3 views
2

이 프로그램을 사용하여 스택에서 데이터를 푸시하려고 시도하는 중 잘못된 출력이 표시됩니다. 스택 크기가 5이지만 스택 요소를 인쇄하면 잘못된 값을 제공하면서 무한 루프로 실행됩니다. 오류가 무엇입니까?C에서 linkedlist를 사용하여 스택을 구현하는 중 오류가 발생했습니다.

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

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

struct node *top = NULL; 

int count = 0; 

void push(int num) { 
    struct node *newNode = (struct node*)malloc(sizeof(int)); 
    newNode->data = num; 
    newNode->next = NULL; 

    if (top == NULL) { 
     top = newNode; 
    } else { 
     struct node *temp = (struct node*)malloc(sizeof(int)); 
     temp = top; 
     top = newNode; 
     top->next = temp; 
     free(temp); 
    } 
    count++; 
} 

int pop() { 
    if (top == NULL) { 
     printf("\nUnderflow- Stack is empty!"); 
     return -1; 
    } 
    struct node *temp = (struct node*)malloc(sizeof(int)); 
    temp = top; 
    top = top->next; 
    return temp->data; 
} 

int stackTop() { 
    if (top == NULL) { 
     printf("\nStack is empty"); 
     return -1; 
    } 
    return top->data; 
} 

void printStack() { 
    if (top == NULL) { 
     printf("\nStack is empty. Nothing to print"); 
    } 
    printf("\n"); 
    while (top != NULL) { 
     printf("%d ", top->data); 
     top = top->next; 
    } 
} 

/* Count stack elements */ 
void stack_count() { 
    printf("\n No. of elements in stack : %d", count); 
} 

int main(void) { 
    int poppedValue, topValue; 
    push(1); 
    push(2); 
    push(3); 
    push(4); 
    push(5); 

    stack_count(); 

    printStack(); 

    poppedValue = pop(); 
    topValue = stackTop(); 

    printf("\nPop item : %d", poppedValue); 
    printf("\nTop Value: %d", topValue); 

    return 0; 
} 

출력 : 당신은 당신의 push() function.You 내부 temp 노드를 사용할 필요가 없습니다

No. of elements in stack : 5 
5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 .... 
+0

당신은 push''에 버그가 있습니다. 작은 프로그램을 디버깅하는 방법 (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 읽어보십시오. – StoryTeller

+0

'struct node * newNode = (struct node *) malloc (sizeof (int));'struct node * newNode = malloc (sizeof (struct node)); ' – BLUEPIXY

+0

'struct node * temp = (struct node *) malloc (sizeof (int)); 임시 직원 = 위쪽; top = newNode; top-> next = temp; 무료 (임시);'->'newNode-> 다음 = 위쪽; top = newNode;' – BLUEPIXY

답변

0

단지 그것을 사용하여 메모리를 낭비하고있다.

다음은 개선 된 코드이며 성공적으로 실행됩니다.

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

struct node{ 
    int data; 
    struct node* next; 
}; 
struct node* top = NULL; 

int count = 0; 

void push(int num){ 
    struct node* newNode = (struct node*)malloc(sizeof(struct node)); 
    newNode->data = num; 
    newNode->next =top; 
    top=newNode; 
    count++; 
} 

int pop(){ 
    if(top == NULL){ 
     printf("\nUnderflow- Stack is empty!"); 
     return -1; 
    } 

    int ans=top->data; 
    struct node *temp = top; 
    top = top->next; 
    free(temp); 
    count--; 
    return ans; 
} 

int stackTop(){ 
    if(top == NULL){ 
     printf("\nStack is empty"); 
     return -1; 
    } 
    return top->data; 
} 


void printStack(){ 
    struct node *t=top; 
    if(t == NULL){ 
     printf("\nStack is empty. Nothing to print"); 
    } 
    printf("\n"); 
    while(t != NULL){ 
     printf("%d ",t->data); 
     t=t->next; 
    } 
} 

/* Count stack elements */ 
    void stack_count() 
    { 
     printf("\n No. of elements in stack : %d", count); 
    } 

int main(void) { 

    int poppedValue, topValue; 
    push(1); 
    push(2); 
    push(3); 
    push(4); 
    push(5); 

    stack_count(); 


    printStack(); 

    poppedValue = pop(); 
    topValue = stackTop(); 

    printf("\nPop item : %d", poppedValue); 
    printf("\nTop Value: %d", topValue); 

    return 0; 
} 

OUTPUT

No. of elements in stack : 5 
5 4 3 2 1 
Pop item : 5 
Top Value: 4 
+0

맞아, 내 대답을 업데이트 할 것입니다. – a874

+0

'push()'는 단순화 될 수 있고'pop()'은'count'를 감소시켜야합니다. – chqrlie

1

여러분의 프로그램은 여러 문제가있다 :

  • 당신이 잘못된 크기로 node 구조를 할당 : sizeof(int). malloc()의 반환 값 캐스팅은 C에서 필요하지 않으며 나쁜 스타일로 간주됩니다. 올바른 크기를 보장하는이 메서드를 사용해야합니다.

    struct node *newNode = malloc(sizeof(*newNode)); 
    

    이 문제만으로는 정의되지 않은 동작이 발생하여 관찰 된 문제를 설명 할 수 있습니다.

  • 메시지 앞에 줄 바꿈을 인쇄하면 버그가 아니지만 출력이 혼란 스럽습니다. 메시지 끝 부분에 개행 문자를 넣어야합니다.

  • push 함수는 temp에 메모리를 할당하지만 사용하지는 않습니다. temp은 즉시 free 다른 값으로 덮어 쓰여 지므로 같은 개체에 대해 free이 여러 번 호출 될 수 있습니다. 이것은 분명히 정의되지 않은 행동으로 이어지는 버그입니다.

  • pop 기능도 스택을 엉망으로 만들고 맨 위 노드를 비우지 않습니다.

  • 스택에서 요소를 팝 때 count을 감소시키는 것을 잊지 마십시오.

  • 기능 printStack()은 스택 top을 수정하므로 메모리에 더 이상 액세스 할 수 없습니다. 임시 변수를 사용해야합니다. 여기

는 수정 된 버전입니다 :

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

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

struct node *top = NULL; 
int count = 0; 

void push(int num) { 
    struct node *newNode = malloc(sizeof(*newNode)); 
    if (newNode == NULL) { 
     printf("Memory allocation failed\n"); 
     return; 
    } 
    newNode->data = num; 
    newNode->next = top; 
    top = newNode; 
    count++; 
} 

int pop(void) { 
    if (top == NULL) { 
     printf("Underflow. Stack is empty!\n"); 
     return -1; 
    } else { 
     int data = top->data; 
     struct node *temp = top; 
     top = top->next; 
     free(temp); 
     count--; 
     return data; 
    } 
} 

int stackTop(void) { 
    if (top == NULL) { 
     printf("Stack is empty\n"); 
     return -1; 
    } 
    return top->data; 
} 

void printStack(void) { 
    if (top == NULL) { 
     printf("Stack is empty. Nothing to print\n"); 
     return; 
    } 
    struct node *temp = top; 
    while (temp != NULL) { 
     printf("%d ", temp->data); 
     temp = temp->next; 
    } 
    printf("\n"); 
} 

/* Count stack elements */ 
void stack_count(void) { 
    printf("No. of elements in stack: %d\n", count); 
} 

int main(void) { 
    int poppedValue, topValue; 

    push(1); 
    push(2); 
    push(3); 
    push(4); 
    push(5); 
    stack_count(); 
    printStack(); 
    poppedValue = pop(); 
    topValue = stackTop(); 
    printf("Popped item: %d\n", poppedValue); 
    printf("Top Value: %d\n", topValue); 

    return 0; 
} 

출력 :

No. of elements in stack: 5 
5 4 3 2 1 
Popped item: 5 
Top Value: 4