头文件 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;
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;
#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;
}
}
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);
}
但是如果不包含在同一个cpp里,用blb.cpp包含blb.h
main.cpp包含blb.h
则报错,说blb.cpp的blb.obj重复定义
如何解决这个问题????????????????
在blb.h开始处添加
#if !defined(blb_h_include_)
#define (blb_h_include_)文件结尾添加
#endif
中加入
#ifndef _BLB_H_
#define _BLB_H_
中间是你的blb.h内容
#endif
这个作用就是为了避免重复include头文件