我看一本c语言教材上写的,它说c中指针可以未定义就使用,叫不完全类型
原代码如下:
它在stack.h中用stackCDT定义了一个变量,但stackCDT却是在stack.c中实现的
/*File:stack.h*/
#ifndef _stack_h
#define _stack_h
#include "genlib.h"
typedef double stackElementT;
typedef struct stackCDT *stackADT;
stackADT NewStack(void);
void FreeStack(stackADT stack);
void Push(stackADT stack,stackElementT element);
void ExpandStack(stackADT stack);
stackElementT Pop(stackADT stack);
bool StackIsEmpty(stackADT stack);
bool StackIsFull(stackADT stack);
int StackDepth(stackADT);
stackElementT GetStackElement(stackADT stack,int index);
#endif
/*File: stack.c*/
#include <stdio.h>
#include "genlib.h"
#include "stack.h"
struct stackCDT
{
stackElementT *elements;
int count;
int size;
};
stackADT NewStack(void)
{
stackADT stack;
stack=New(stackADT);
stack->elements=NewArray(InitialStackSize,stackElemmentT);
stack->count=0;
stack->size=/*File: stack.c*/
#include <stdio.h>
#include "genlib.h"
#include "stack.h"
stackADT NewStack(void)
{
stackADT stack;
stack=New(stackADT);
stack->elements=NewArray(InitialStackSize,stackElemmentT);
stack->count=0;
stack->size=InitialStackSize;
return stack;
}
void FreeStack(stackADT stack)
{
FreeBlock (stack->elements);
FreeBlock (stack);
}
void Push(stackADT stack,stackElementT element)
{
if(stack->count==size) ExpandStack(stack);
stack->elements[stack->count++]=element;
}
static void ExpandStack(stackADT stack)
{
stackElementT *array;
int i,newSize;
newSize=stack->size*2;
array=NewArray(newSize,stackElementT);
for(i=0;i<stack->size;i++)
{
array[i]=stack->elements[i];
}
FreeBlock(stack->elements);
stack->elements=array;
stack->size=newSize;
}
stackElementT Pop(stackADT stack)
{
if (StackIsEmpty(stack)) Error("Pop of an empty stack");
return(stack->elements[--stack->count]);
}
bool StackIsEmpty (stackADT stack)
{
return(stack->count==0)
}
bool StackIsFull(stackADT stack)
{
return FALSE;
}
int StackDepth(stackADT stack)
{
return(stack->count);
}
stackElementT GetStackElement(stackADT stack,int index)
{
if (index<0||index>=stack->count)
{
Error("Non existent stack element");
}
return(stack->elements[stack->count-index-1]);
}