数据结构顺序栈代码,老是报错,求大神帮忙看一下哪里有问题。

/*
实验内容:
1.利用数组建立并初始化一个顺序栈,并将此栈中各元素的值依次输出;
2.当栈不满时将一个新元素入栈,并依次输出此时栈中各元素的值。
3.当栈不空时将栈顶元素出栈,并输出此时栈中各元素的值。

实验要求:
栈的最大空间为10个元素单元,栈中已有部分元素,栈中元素值的类型为字符型。
要求新入栈的元素可以从键盘输入。
当操作不合理或不能完成时,程序应能处理并输出相应信息。
带星号的第3项实验内容为选作内容。
*/

#include<stdio.h>
#include<stdlib.h> //需要的头文件
typedef char StackData;
typedef struct 
{   
    StackData *base;    
    StackData *top; 
    int stacksize;
} SeqStack;  //说明顺序栈的结构体变量类型

void main()
{
 Create_Stack(S);
 printf("顺序栈中已有的元素值为:\n");
 Print_Stack(S);
 printf("\n请输入要入栈的新元素值:\n");
 scanf("%c",&x);
 Push(S,x); //将新元素x入栈
 printf("新元素入栈后栈中元素的值为:\n");
 Print_Stack(S);
}

void Create_Stack(S)//初始化建立顺序栈
{
  S.base=(StackData*)malloc(10*sizeof(StackData));
  S.top=S.base;
  S.stacksize=10;
  char a[10]={'a','b','c','d','e','f','g','h'};
  int i;
  for(i=0;i<=9;i++)
  {
    *S.top=a[i];
    S.top++;
  }
}


void Print_Stack(S)//依次输出栈中各元素的值
{
  StackNode *p;
  p=S.base;
  while(p<S.top)
  {
    printf("%c ",*p);
    p++;
  }
}


void Push(SeqStack S,StackData x) //将新元素x入栈
{
    if(StackFull(S))
    {
      S.base=(StackData*)realloc(S.base,(S.stacksize+10)*sizeof(StackData));
      if(!S.base) exit(overflow);//追加存储空间失败
      S.top=S.base+S.stacksize;
      S.stacksize+=10;
    }
    *S.top=x;
    S.top++;
}

我不知道你是不是没写完还是其它什么原因,里面有很多东西都还没有写。
主要是你的函数放在main后面,前面要加声明还有就是一些变量没有声明。我只改了你的语法问题,Stackfull()还没有写。
下面是代码

/*
实验内容:
1.利用数组建立并初始化一个顺序栈,并将此栈中各元素的值依次输出;
2.当栈不满时将一个新元素入栈,并依次输出此时栈中各元素的值。
3.当栈不空时将栈顶元素出栈,并输出此时栈中各元素的值。

实验要求:
栈的最大空间为10个元素单元,栈中已有部分元素,栈中元素值的类型为字符型。
要求新入栈的元素可以从键盘输入。
当操作不合理或不能完成时,程序应能处理并输出相应信息。
带星号的第3项实验内容为选作内容。
*/

#include<stdio.h>
#include<stdlib.h> //需要的头文件
#define overflow -1
typedef char StackData;
typedef struct
{
    StackData *base;
    StackData *top;
    int stacksize;
} SeqStack;  //说明顺序栈的结构体变量类型
void Create_Stack(SeqStack S);   //初始化建立顺序栈
void Print_Stack(SeqStack S);   //依次输出栈中各元素的值
void Push(SeqStack S,StackData x);   //将新元素x入栈
int StackFull(SeqStack S);

int main()
{
 char x;
 SeqStack S;
 Create_Stack(S);
 printf("顺序栈中已有的元素值为:\n");
 Print_Stack(S);
 printf("\n请输入要入栈的新元素值:\n");
 scanf("%c",&x);
 Push(S,x); //将新元素x入栈
 printf("新元素入栈后栈中元素的值为:\n");
 Print_Stack(S);
 return 0;
}

void Create_Stack(SeqStack S)//初始化建立顺序栈
{
  S.base=(StackData*)malloc(10*sizeof(StackData));
  S.top=S.base;
  S.stacksize=10;
  char a[10]={'a','b','c','d','e','f','g','h'};
  int i;
  for(i=0;i<=9;i++)
  {
    *S.top=a[i];
    S.top++;
  }
}


void Print_Stack(SeqStack S)//依次输出栈中各元素的值
{
  StackData *p;
  p=S.base;
  while(p<S.top)
  {
    printf("%c ",*p);
    p++;
  }
}


void Push(SeqStack S,StackData x) //将新元素x入栈
{
    if(StackFull(S))
    {
      S.base=(StackData*)realloc(S.base,(S.stacksize+10)*sizeof(StackData));
      if(!S.base) exit(overflow);//追加存储空间失败
      S.top=S.base+S.stacksize;
      S.stacksize+=10;
    }
    *S.top=x;
    S.top++;
}

主函数里的S,x,都没有定义,没有定义这个类型StackNode