2017-04-14 1 views
1

나는이에서 C로 기본 스택을 사용하는 프로그램을 만드는 오전 나는 제목에 정의 된 두 개의 구조를 가지고 :C 데이터 구조 오류

  1. 구조라는 문자열 노드 및 이전에 대한 포인터를 구성원으로 노드.
  2. 구성원으로 마지막 노드에 대한 포인터가있는 스택 구조체. 여기

    내 헤더 파일에 이러한 구조의 정의를 다음과 같습니다

    CreateStack :이 함수는 스택을 생성합니다 (해당

    #include <stdio.h> 
    #include <stdlib.h> 
    typedef struct Node { 
    const char* string; 
    struct Node *prev; 
    }; 
    
    typedef struct Stack { 
    size_t sizeOfStack; 
    size_t sizeOfElem; 
    struct Node *last; 
    }; 
    

한 가지 방법 나 오류를주는 것은 CreateStack()이다 생성자).

(가) 이름 : CreateStack

(B) 반환 유형 : 힙에 할당 된 스택에 대한 포인터. 여기

내 구현

Stack* CreateStack() { 
     Stack* stack = malloc(sizeof(*stack)); 
     if (stack == NULL) { 
      return NULL; 
     }//end of if 
     stack->sizeOfElem = 0; 
     stack->sizeOfStack = 0; 
     stack->last = NULL; 
     return stack; 
    }//end of CreateStack 

하지만 컴파일러는 이것을 침된다

오류 : '{일명 스택 구조체} 스택'라는 이름의 멤버가없는 '마지막' stack-> 마지막으로 = 마디;

오류 : 'Stack {aka struct stack}'에는 'last'라는 멤버가 없습니다. node-> prev = stack-> last;

오류 : 'Stack {aka struct stack}'에 'last'라는 멤버가 없습니다. Node * node = stack-> last;

누군가가 여기에서 문제를 지적 할 수 있다면 크게 감사하겠습니다. 나는 왜 그것이 마지막 것이 아니라는 것을 말하는 지 혼란 스럽다. 그러나 다른 구조에서 같은 방식으로 미리 정의 된 것은 깃발을 올리지 않는다. 감사.

+0

귀하의 컴파일러 오류는 보여 코드에 있지 않습니다. 귀하의 typedef는 불완전합니다. – aschepler

+0

"디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까? ")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 참조 : [** 최소, 완전하고 검증 가능한 예제를 만드는 방법 **] (http://stackoverflow.com/help/mcve). " –

+0

@aschepler 그렇습니다.이 코드는 긴 코드입니다.이 오류는 구조체를 사용하는 메서드에만 해당되지 않으므로 구조체에 오류가 있다고 가정합니다. 구조 자체를 제공했습니다. 모든 오류는 "마지막"을 존재하지 않는 것으로 참조합니다. –

답변

1

형식의 이름을 정의하지 않았으므로 typedef 문이 불완전합니다. 다음을 적는다. 지금 Stackstruct Stack는 등가 인 입력 정의 끝에 Stack

typedef struct Stack { 
    size_t sizeOfStack; 
    size_t sizeOfElem; 
    struct Node *last; 
}Stack; 

참고.

+1

'Stack * stack = malloc (sizeof (* stack))'은 괜찮습니다. – PSkocik

+0

@PSkocik : 오른쪽; 나는 타이포 (typo)를 위해 * stack을 잡았고, OP는'Stack (스택) '을 의미한다고 가정했다. –

1

는 형식 정의를 수정하고 컴파일합니다 :

#include <stdio.h> 
#include <stdlib.h> 
typedef struct Node { 
const char* string; 
struct Node *prev; 
} Node ; 

typedef struct Stack { 
size_t sizeOfStack; 
size_t sizeOfElem; 
struct Node *last; 
} Stack; 

Stack* CreateStack() { 
    Stack* stack = malloc(sizeof(*stack)); 
    if (stack == NULL) { 
     return NULL; 
    }//end of if 
    stack->sizeOfElem = 0; 
    stack->sizeOfStack = 0; 
    stack->last = NULL; 
    return stack; 
}//end of CreateStack 
+0

그의 코드가 구문 오류가 아닌 이유는 무엇입니까? 'typedef '는 실제로 이름없이 허용됩니까? 그것은 무엇을합니까? – Barmar

+0

@Barmar 구문 오류를 생성하는 메커니즘입니다. :) – PSkocik