头文件   blb.h#define Max_ZiMS 52  
 struct ZiJD{
    ZiJD *next;
char BianLM[9];
int BianLZ;
};
 struct TouJD{
char KaiSZF;
ZiJD*Hnext;
}TouJDD[Max_ZiMS+1]={{'A',NULL},{'B',NULL},{'C',NULL},{'D',NULL}
                ,{'E',NULL},{'F',NULL},{'G',NULL},{'H',NULL}
                ,{'I',NULL},{'J',NULL},{'K',NULL},{'L',NULL}
,{'M',NULL},{'N',NULL},{'O',NULL},{'P',NULL}
,{'Q',NULL},{'R',NULL},{'S',NULL},{'T',NULL}
,{'U',NULL},{'V',NULL},{'W',NULL},{'X',NULL}
,{'Y',NULL},{'Z',NULL},{'a',NULL},{'b',NULL}
,{'c',NULL},{'d',NULL},{'e',NULL},{'f',NULL}
,{'g',NULL},{'h',NULL},{'i',NULL},{'j',NULL}
,{'k',NULL},{'l',NULL},{'m',NULL},{'n',NULL}
,{'o',NULL},{'p',NULL},{'q',NULL},{'r',NULL}
,{'s',NULL},{'t',NULL},{'u',NULL},{'v',NULL}
,{'w',NULL},{'x',NULL},{'y',NULL},{'z',NULL}
,{'0',NULL}};void ChuangJLSJD(char *chars);  /*创建临时结点*/                            /*由词法分析器调用*/          
int BiJBLMXH(ZiJD *T) ;         /*比较变量名先后*/
int ChaTWZ();                   /*查头位置*/
int ZhongCZ();                  /*总查找*/
void ZhongTJ();                 /*总添加*/
int ShiFTJ();                   /*是否添加临时结点*/                        /*由语法分析器调用*/
extern char *chars;

解决方案 »

  1.   

    源文件 blb.cpp
    #include "blb.h"
    #include "stdio.h"
    #include "math.h"
    #include "malloc.h"
    #include "string.h"void ChuangJLSJD(char *chars)                 //创建临时结点,并将临时结点连入TouJDD[52]
    {   
    struct ZiJD *LSJD;
        LSJD=(ZiJD*)malloc(sizeof(ZiJD));
        LSJD->next=NULL;
        LSJD->BianLZ=0;
    strcpy(LSJD->BianLM,chars);
        TouJDD[52].Hnext=LSJD;
        
     
    }
    int BiJBLMXH(ZiJD *T)               //变量名先后次序比较
    {                                   //返回值>0表示前面临时结点的变量名字比与之比较的结点的变量名字大
                                    //返回值=0表示前面临时结点的变量名字与与之比较的结点的变量名字相等
    int i;                          //返回值<0表示前面临时结点的变量名字比与之比较的结点的变量名字小
    char *s1;
    char *s2;
    s1=TouJDD[52].Hnext->BianLM;
    s2=T->BianLM;
    i=strcmp(s1,s2);
    return i;
    }int ChaTWZ()                        //查找与临时结点的第一个字母相符的头结点
    {
    int i;
    if(((TouJDD[52].Hnext->BianLM[0]-'A')>=0) && ((TouJDD[52].Hnext->BianLM[0]-'A')<=26))
    i=TouJDD[52].Hnext->BianLM[0]-'A';
    else
    i=TouJDD[52].Hnext->BianLM[0]-'a'+27;
    return i;
    }int ZhongCZ()                     //查找临时结点中的变量是否在动态表中
    {

        ZiJD *u;
    int i;
    i=ChaTWZ();
    u=TouJDD[ChaTWZ()].Hnext;
    for(;u!=NULL&&BiJBLMXH(u)>0;u=u->next);
    if(u==NULL)
       return 0;
        else
    {
    if(BiJBLMXH(u)==0)  
    return 1;
    else
    return 0;
    }
    }void ZhongTJ()                                  //添加不在动态表中的的临时结点的变量名
    {                                              
    int i,j;
    i=ChaTWZ();                      
    ZiJD *u,*v;
    u=NULL;
    v=TouJDD[i].Hnext;
    if(TouJDD[i].Hnext==NULL)
    {
    TouJDD[i].Hnext=TouJDD[52].Hnext;   //无首结点
          TouJDD[52].Hnext=NULL;
    }
    else 
    {   
    j=BiJBLMXH(v);
    if(v->next==NULL)                            //只有一个结点
    {
    if(j<0)
    {
    TouJDD[52].Hnext->next=TouJDD[i].Hnext;
    TouJDD[i].Hnext=TouJDD[52].Hnext;
    }
    else
    {
    TouJDD[52].Hnext->next=NULL;
    TouJDD[i].Hnext->next=TouJDD[52].Hnext;
    }
    }
            else
    {
    for(;v->next!=NULL&&j>0;u=v,v=v->next,j=BiJBLMXH(v)); //多个结点
            if(v->next==NULL)
    {
    if(j>0)
    {
    TouJDD[52].Hnext->next=NULL;
                v->next=TouJDD[52].Hnext;
    }
        else
    {
    TouJDD[52].Hnext->next=v;
    u->next=TouJDD[52].Hnext;
                    }                          
    }
        else 

    if(u==NULL)
    {
    TouJDD[52].Hnext->next=v;
    TouJDD[i].Hnext=TouJDD[52].Hnext;
    }
    else
    {
    TouJDD[52].Hnext->next=v;
        u->next=TouJDD[52].Hnext;
    }
    }
    }
    }
    }
    int ShiFTJ()                     //是否添加临时结点,如查找到,则删除,没查到就添加
    {
      if(ZhongCZ()==0)
      {
      ZhongTJ();
      TouJDD[52].Hnext=NULL;
          return 1;
      }
      else
      {
      TouJDD[52].Hnext=NULL;
          return 0;
      }
    }
      

  2.   

    主函数  main
    void main()
    {
    int i,j,x,y,z,v;
    char *chars4="AAAdffff";
    char *chars3="AAbBdssd";
    char *chars2="AACass";
    char *chars1="AADasdsd";
        
        ZiJD *h ;
     
       ChuangJLSJD(chars1);
       i=ChaTWZ();
       x=ShiFTJ() ;
       //ZhongTJ(); 
       ChuangJLSJD(chars2);
       
       y= ShiFTJ();//ZhongTJ(); 
       ChuangJLSJD(chars3);
     //  j=ChaTWZ();
      z=ShiFTJ() ;
       // ZhongTJ(); ChuangJLSJD(chars4);
     v=ShiFTJ() ;
       //ZhongTJ(); h=TouJDD[i].Hnext;
    // k=TouJDD[j].Hnext;
    while(h!=NULL)
    { printf("%s\n",h->BianLM);
      h=h->next;
    }
    //   while(k!=NULL)
    // { printf("%s\n",k->BianLM);
    //   k=k->next;
    // }
        
    //   printf("%d,%d,%d,%d",x,y,z,v);//  printf("%s\n",TouJDD[i].Hnext->BianLM);
      //  printf("%s\n",TouJDD[j].Hnext->next->BianLM);


    //TouJDD[0].Hnext=(ZiJD*)malloc(sizeof(ZiJD));
           // TouJDD[0].Hnext->next=NULL;
          //  TouJDD[0].Hnext->BianLZ=0;  
             //TouJDD[0].Hnext->BianLM=NULL;
      //     strcpy(TouJDD[0].Hnext->BianLM,chars1);
     // BianLMFZ(chars);
     


        //TouJDD[52].Hnext
    // TouJDD[52].Hnext=(ZiJD*)malloc(sizeof(ZiJD));
          //  TouJDD[52].Hnext->next=NULL;        //TouJDD[52].Hnext->BianLM=NULL;
      //  TouJDD[52].Hnext->BianLZ=0;
      // strcpy(TouJDD[52].Hnext->BianLM,chars2);




    //
    // i=ZhongCZ();
    // printf("%d",i);
       //ZhongTJ();

    //ChuangJLSJD(char2);
    // ZhongTJ();
    // ChuangJLSJD(char3);
    //    ZhongTJ();
      //  printf("%s",TouJDD[0].Hnext->BianLM);
    //   printf("\n");
    //printf("%s",TouJDD[0].Hnext->BianLM);
    // ZhongTJ();
    // printf("%s",TouJDD[0].Hnext->BianLM);
    // printf("\n");
    // printf("%s",TouJDD[0].Hnext->next->BianLM);
    // printf("\n");
    // printf("%s",TouJDD[0].Hnext->next->next->BianLM);
     //   printf("%s",TouJDD[52].Hnext->BianLM);
      
    }
      

  3.   

    如果将三个文件放在同一个cpp里,可以通过vc的编译,并且运行正确
    但是如果不包含在同一个cpp里,用blb.cpp包含blb.h
                                main.cpp包含blb.h
    则报错,说blb.cpp的blb.obj重复定义
     如何解决这个问题????????????????
      

  4.   

    使用条件编译,避免重复定义
    在blb.h开始处添加
    #if !defined(blb_h_include_)
    #define (blb_h_include_)文件结尾添加
    #endif
      

  5.   

    在头文件   blb.h
    中加入
    #ifndef  _BLB_H_
    #define  _BLB_H_
    中间是你的blb.h内容
    #endif
    这个作用就是为了避免重复include头文件