2012-01-25 3 views
0

일반 스택을 만들고 싶습니다. 링크드 목록으로 구현하고 싶습니다. 새로운를 복사, 구조의 두 번째 필드는 함수에 대한 포인터입니다C에서 링크드 목록으로 구현 된 일반 스택 만들기


  • : 나는 몇 가지 질문이

    typedef struct stack 
    { 
        void * data; 
    
        void (*copy)(void *o); 
    
        struct stack *next; 
    
    } stack_l; 
    

    :

    나는이 구조 stack_l을 생성 데이터 (함수 Push의 인수로 전달). 푸시 기능 의 원형은 다음

stack_l * 푸시 (stack_l * 헤드 공극 * d);

  1. 포인터를 함수 사본에 전달하는 방법이 맞습니까?
  2. 함수 Push에서 구현해야합니까 ??
는 필요한 구조의 필드를 inizialize하는 (예를 들어) 함수 NewStack을 만들 아니면 더 나은 스택이 비어있는 경우 첫 번째 요소를 생성 만 누름 기능을 가지고 있으며, 하나 이상의 요소가있는 경우 맨 위에 새 요소를 추가 하시겠습니까?
  • 무효 * 필요
  • 는 malloc에 ​​할당한다?
+0

분명히 요소를 제거하는 Pop 함수도 만들었습니다. – Kyrol

답변

1

우선 stackstack_l에 다른 식별자를 요구하지 않습니다. 자, 질문 :

Push 기능이 copy 필드의 유형과 호환되지 않습니다 (stack_l). struct에 (member-) 함수에 대한 포인터를 포함하여 C++처럼 보이게하려면이 함수에 객체를 전달해야합니다.

예, 어딘가에서 기능을 구현해야하며 이는 struct stack의 정의 안에있을 수 없습니다. 이것은 어떤 종류의 생성자 함수가 필요함을 의미합니다 (원할 경우 newStack이라고 부를 수 있습니다). 생성자는 최소한 함수 포인터를 초기화해야합니다 (유지하려는 경우). 당신이이 함수 포인터를 유지하지 선택하는 경우 당신이 제안 당신이 당신의 push 일상에서 잘 초기화 코드를 넣을 수 있습니다 : 당신이 명시 적으로 빈 스택이 무엇인지 명시해야

stack_l* stackPush(stack_l* head, void* content) { 
    // head might be NULL, meaning the stack is "empty" or it might be an actual pointer 
    // we don't care 
    stack_l* const front = malloc(sizeof(stack_l)); 
    *front = (stack_l){.data = content, .next = head}; 
    return front; 
} 

참고.당신의 마지막 질문에

void stackDestroyEmpty(stack_l* s) { 
    assert(s == NULL && "Tried to destroy non-empty stack."); 
} 

:

stack_l* stackCreateEmpty() { 
    retun NULL; 
} 

을 그리고 어쩌면 소멸자 : 그래서 당신은 명확성을 위해 생성자를 구현할 수 있습니다 위에서 보듯이, 당신이 공간을 얻을 수 malloc을 사용해야합니다 stack_l의 일부이므로 void* 회원에게 추가 공간을 할당 할 필요가 없습니다.

+0

의견을 보내 주셔서 감사합니다. .data = content가있는 데이터에 void * 내용을 지정하면 필자의 함수 복사본이 필요한지 이해할 수 없습니다. 아마 나는 잘 undestand하지 않습니다. – Kyrol

+0

왜 자바와 같은 생성자를 생성해야합니까? – Kyrol

+2

@Kyrol : 꼭 할 필요는 없습니다! 앞에서 말했듯이, 명확성을 위해 스택 구현의 사용자가 유지할 인터페이스가 있습니다. 'copy'에 대해서 : 스택은'void' 포인터만을 저장하기 때문에 (포인터가 지시하는 물건이 아닌 포인터의 리터럴 값을 저장합니다), 복사 기능을 구현할 필요가 없습니다. 단순히 포인터를 그대로 복사하십시오. ** 그러나 ** 포인터가 가리키는 부분을 복사하려면 ** 사용자 정의 스택 매개 변수가 push 함수에 제공되어야합니다. 왜냐하면 스택에 저장할 내용을 확실하게 알 수 있기 때문입니다. 희망이 당신을 도울, 그렇지 않으면 부탁드립니다. – bitmask