如果有任何问题可以私信
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <stdbool.h>
#include <dirent.h>
typedef char *KeyType;
typedef struct
{KeyType id;char *password,*file_name;unsigned long long int score;
}Elemtype;
typedef struct BSTNode
{Elemtype data;int _Depth;struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
char *hui_fu_data(char *a,int mods)
{int b;for(b=0;b<strlen(a);b++){if(a[b]!='\n'){if(mods==1){a[b]=a[b]+100;}else if(mods==2){a[b]=a[b]-100;}}}return a;
}
int bi_(char *a,char *b)
{if(strcmp(a,b)==0){return 2;}else if(strlen(a)>strlen(b)){return 1;}else if(strlen(a)<strlen(b)){return 0;}else{int c;for(c=0;c<strlen(a);c++){if(a[c]!=b[c]){break;}}if(a[c]>b[c]){return 1;}else{return 0;}}
}
void InsertBFS(BSTree *a,Elemtype b)
{if(!(*a)){BSTree c;c=(BSTree)malloc(sizeof(BSTNode));c->lchild=c->rchild=NULL;c->data=b;*a=c;}else if(!bi_(b.id,(*a)->data.id)){InsertBFS(&(*a)->lchild,b);}else{InsertBFS(&(*a)->rchild,b);}
}
BSTree BSTree_Data(BSTree a)
{if((!a)||((!a->lchild)&&(!a->rchild))){return NULL;}else if((a->lchild)&&(a->rchild)){return a->lchild->_Depth>a->rchild->_Depth?a->lchild:a->rchild;}else{return a->lchild?a->lchild:a->rchild;}
}
void BSTree_Depth_Data(BSTree *a)
{BSTree b;b=BSTree_Data(*a);if(b){(*a)->_Depth=b->_Depth+1;}else if(*a){(*a)->_Depth=1;}
}
void _Depth_Data(BSTree *a,KeyType key)
{if(*a){int mods;if((mods=bi_(key,(*a)->data.id))==0){_Depth_Data(&(*a)->lchild,key);}else if(mods==2){return;}else{_Depth_Data(&(*a)->rchild,key);}BSTree_Depth_Data(a);}
}
void BSTree_Data2(BSTree *a,BSTree *b1,BSTree *c1,KeyType key)
{BSTree b,c=NULL;b=*a;while(b){int mods;if((mods=bi_(key,b->data.id))==2){break;}c=b;if(!mods){b=b->lchild;}else{b=b->rchild;}}*c1=b;*b1=c;
}
int jian_(BSTree a)
{if((!a)||(!a->lchild)&&(!a->rchild)){return 0;}else if((a->lchild)&&(a->rchild)){int w;w=a->lchild->_Depth-a->rchild->_Depth;if(w<-1){return 1;}else if(w>1){return 2;}else{return 0;}}else if(!a->lchild){if(a->rchild->_Depth>1){return 1;}}else if(!a->rchild){if(a->lchild->_Depth>1){return 2;}}return 0;
}
int jian_ce2(BSTree a)
{if((!a)||(!a->lchild)&&(!a->rchild)){return 0;}else if((a->lchild)&&(a->rchild)){int w;w=a->lchild->_Depth-a->rchild->_Depth;if(w==-1){return 1;}else if(w==1){return 2;}else{return 0;}}else if(!a->lchild){if(a->rchild->_Depth==1){return 1;}}else if(!a->rchild){if(a->lchild->_Depth==1){return 2;}}return 0;
}
void BSTree_Data3(BSTree *a,BSTree *b1,KeyType key)
{BSTree b,c=NULL;b=*a;while(b){if(jian_(b)){c=b;}int mods;if((mods=bi_(key,b->data.id))==2){break;}if(!mods){b=b->lchild;}else{b=b->rchild;}}*b1=c;
}
void BSTree_AVL_LL(BSTree *a,BSTree b1)
{if(!b1){return;}BSTree b,c,d,e;BSTree_Data2(a,&b,&c,b1->data.id);d=c->lchild;e=d->rchild;d->rchild=c;c->lchild=e;if(!b){*a=d;}else if(b->lchild==c){b->lchild=d;}else{b->rchild=d;}_Depth_Data(a,c->data.id);
}
void BSTree_AVL_RR(BSTree *a,BSTree b1)
{if(!b1){return;}BSTree b,c,d,e;BSTree_Data2(a,&b,&c,b1->data.id);d=c->rchild;e=d->lchild;d->lchild=c;c->rchild=e;if(!b){*a=d;}else if(b->lchild==c){b->lchild=d;}else{b->rchild=d;}_Depth_Data(a,c->data.id);
}
void BSTree_AVL(BSTree *a,KeyType key)
{BSTree b,c;BSTree_Data3(a,&b,key);int mods;if(!b){return;}else if((mods=jian_(b))==2){c=b->lchild;if(jian_ce2(c)==1){BSTree_AVL_RR(a,c);}BSTree_AVL_LL(a,b);}else{c=b->rchild;if(jian_ce2(c)==2){BSTree_AVL_RR(a,c);}BSTree_AVL_LL(a,b);}
}
char *input_char(char *a)
{fgets(a,1500000,stdin);a[strlen(a)-1]='\0';return a;
}
void BSTree_Data_FPrint(Elemtype a)
{char *Data;Data=(char*)malloc(sizeof(char)*1500000);sprintf(Data,"id:\n%s\npassword:\n%s\nscore:\n%lld\n",a.id,a.password,a.score);Data=hui_fu_data(Data,1);FILE*fp=fopen(a.file_name,"wt+");fputs(Data,fp);free(Data);fclose(fp);
}
void Elemtype_data(Elemtype *a,char *file,char mods,bool *mods2)
{printf("请输入用户名:");char *b;b=(char*)malloc(sizeof(char)*1500000);do{b=input_char(b);}while(strlen(b)==0);a->id=(char*)malloc(sizeof(char)*(strlen(b)+1));strcpy(a->id,b);printf("请输入用户密码:");b=(char*)malloc(sizeof(char)*1500000);do{b=input_char(b);}while((strlen(b)>20)||(strlen(b)<6));a->password=(char*)malloc(sizeof(char)*(strlen(b)+1));strcpy(a->password,b);sprintf(b,"%s\\%s.txt",file,a->id);a->file_name=(char*)malloc(sizeof(char)*(strlen(b)+2));strcpy(a->file_name,b);free(b);a->score=0;*mods2=true;if(mods=='1'){if(_access(a->file_name,F_OK)==-1){BSTree_Data_FPrint(*a);*mods2=false;}}
}
void Elemtype_FREE(Elemtype *a)
{free(a->file_name);free(a->id);free(a->password);
}
void FREE(BSTree *a)
{BSTree b;b=*a;if(b){Elemtype_FREE( b->data ;}
}
bool DeleteBFS(BSTree *a,KeyType key)
{BSTree b,c,d,e;BSTree_Data2(a,&b,&c,key);if(!c){return false;}remove(c->data.file_name);char *file_data_tmp;file_data_tmp=(char*)malloc(sizeof(char)*(strlen(c->data.file_name)+6));sprintf(file_data_tmp,"%s_.tmp",c->data.file_name);remove(file_data_tmp);free(file_data_tmp);d=c;if((c->lchild)&&(c->rchild)){e=c->lchild;while(e->rchild){d=e;e=e->rchild;}FREE(&c);c->data=e->data;if(d!=e){d->rchild=e->lchild;}else{d->lchild=e->lchild;}free(e);_Depth_Data(a,d->data.id);BSTree_AVL(a,d->data.id);return true;}else if(!c->lchild){c=c->rchild;}else if(!c->rchild){c=c->lchild;}if(!b){*a=c;}else if(b->lchild==d){b->lchild=c;}else{b->rchild=c;}FREE(&d);if(c){_Depth_Data(a,c->data.id);BSTree_AVL(a,c->data.id);}else if(b){_Depth_Data(a,b->data.id);BSTree_AVL(a,b->data.id);}return true;
}
char *file_data_xv(char *a)
{int b,c;for(b=strlen(a)-1;b>=0;){if(a[b]=='\\'){break;}else{b--;}}b=b+1;char *d;d=(char*)malloc(sizeof(char)*b);for(c=0;c<b-1;c++){d[c]=a[c];}d[c]='\0';char *e;e=(char*)malloc(sizeof(char)*(strlen(d)+9));sprintf(e,"%s\\numbers",d);if(_access(e,F_OK)==-1){_mkdir(e);}free(d);return e;
}
bool FILE_Data4(char *data,Elemtype *U)
{char *mods;if(_access(data,F_OK)==-1){mods="wt+";}else{mods="rt";}FILE*fp=fopen(data,mods);char **w;w=(char**)malloc(sizeof(char*)*6);int e;for(e=0;e<6;e++){w[e]=(char*)malloc(sizeof(char)*1500000);fgets(w[e],1500000,fp);w[e][strlen(w[e])-1]='\0';w[e]=hui_fu_data(w[e],2);}bool mods2;mods2=true;if((bi_(w[0],"id:")==2)&&(bi_(w[2],"password:")==2)&&(bi_(w[4],"score:")==2)){U->file_name=data;U->id=(char*)malloc(sizeof(char)*(strlen(w[1])+1));strcpy(U->id,w[1]);U->password=(char*)malloc(sizeof(char)*(strlen(w[3])+1));strcpy(U->password,w[3]);U->score=atoll(w[5]);mods2=false;}for(e=0;e<6;e++){free(w[e]);}free(w);fclose(fp);return mods2;
}
bool BSTree_jian_ce(BSTree *a,Elemtype data,BSTree *DATA)
{BSTree b,c;BSTree_Data2(a,&b,&c,data.id);if(!c){*DATA=NULL;return true;}if(bi_(data.id,c->data.id)==2){if(_access(c->data.file_name,F_OK)==-1){DeleteBFS(a,c->data.id);return true;}char *Data;Data=(char*)malloc(sizeof(char)*(strlen(c->data.file_name)+6));sprintf(Data,"%s_.tmp",c->data.file_name);remove(Data);if(_access(Data,F_OK)!=-1){*DATA=NULL;free(Data);return true;}else{*DATA=c;free(Data);return false;}}*DATA=NULL;return true;
}
bool _FILE_DATA(char *file_name,char *name,Elemtype *U)
{char *data,*mods;data=(char*)malloc(sizeof(char)*(strlen(file_name)+strlen(name)+3));sprintf(data,"%s\\%s",file_name,name);return FILE_Data4(data,U);
}
void Insert(BSTree *a,Elemtype data)
{InsertBFS(a,data);_Depth_Data(a,data.id);BSTree_AVL(a,data.id);
}
void _DATA(char *file_name,BSTree *y)
{DIR *dir;dir=NULL;if((dir=opendir(file_name))==NULL){printf("数据读取失败!\n");system("pause");exit(0);}else{struct dirent *entry;while(entry=readdir(dir)){bool mods;Elemtype data;mods=_FILE_DATA(file_name,entry->d_name,&data);if(!mods){BSTree e,r;BSTree_Data2(y,&e,&r,data.id);if(!r){Insert(y,data);}}}closedir(dir);}
}
int input_int()
{char *a;a=(char*)malloc(sizeof(char)*1500000);int b;do{a=input_char(a);for(b=0;b<strlen(a);b++){if(!isdigit(a[b])){break;}}}while((b==0)||(b!=strlen(a)));int c;c=atoi(a);free(a);return c;
}
void game_data_1(BSTree *d)
{int len,t;printf("请输入算式数量:");t=input_int();for(len=0;len<t;len++){int a,b,c;do{a=rand()%101;b=rand()%101;}while(a+b>100);printf("%d:%d+%d=",len+1,a,b);c=input_int();if(c==a+b){Elemtype t;t=(*d)->data;free(t.file_name);char *e;e=t.file_name;free(t.password);free(t.id);FILE_Data4((*d)->data.file_name,&t);t.file_name=e;(*d)->data=t;(*d)->data.score=(*d)->data.score+(unsigned long long int)500;BSTree_Data_FPrint((*d)->data);printf("回答正确!\n");}else{printf("回答错误!\n");}}
}
void Deng_Data(BSTree *a,BSTree b)
{char *Data;Data=(char*)malloc(sizeof(char)*(strlen(b->data.file_name)+6));sprintf(Data,"%s_.tmp",b->data.file_name);FILE*fp=fopen(Data,"wt+");free(Data);int mods=0;for(;;){printf("1.注销\n2.100以内加法\n3.查询成绩\n按其它键退出\n");char mod=getch();switch(mod){case '1':fclose(fp);DeleteBFS(a,b->data.id);mods=1;break;case '2':game_data_1(&b);break;case '3':printf("score:%lld\n",b->data.score);break;default:mods=1;fclose(fp);break;}if(mods){break;}system("pause");system("cls");}
}
bool Windows_mods(char *argv)
{int b,c,d,e,f=0;for(b=strlen(argv)-1;b>=1;b--){if(argv[b-1]=='\\'){break;}}for(c=1;c<strlen(argv);c++){if((argv[c-1]=='\\')&&(c!=b)){f=c;}}char *Data;Data=(char*)malloc(sizeof(char)*(b-f+1));for(d=f,e=0;d<b;d++,e++){Data[e]=argv[d];}Data[e-1]='\0';bool mods;if(strcmp(Data,"numberData")==0){mods=false;}else{mods=true;}free(Data);return mods;
}
void FREE_BSTree(BSTree *a)
{if(*a){FREE_BSTree(&(*a)->lchild);FREE_BSTree(&(*a)->rchild);FREE(a);*a=NULL;}
}
void tre_Data(BSTree *a,Elemtype data)
{BSTree b,c;BSTree_Data2(a,&b,&c,data.id);if(c){return;}else if(_access(data.file_name,F_OK)!=-1){Elemtype data2;data2.file_name=(char*)malloc(sizeof(char)*(strlen(data.file_name)+1));strcpy(data2.file_name,data.file_name);FILE_Data4(data2.file_name,&data2);Insert(a,data2);}
}
void Windows_system(char *argv)
{char *a;a=file_data_xv(argv);BSTree f=NULL;_DATA(a,&f);for(;;){printf("1.注册\n2.登录\n其他键退出\n");char c=getch();system("cls");if((c=='1')||(c=='2')){Elemtype data;bool mods;Elemtype_data(&data,a,c,&mods);system("cls");switch(c){case '1':{BSTree e,r;BSTree_Data2(&f,&e,&r,data.id);if(r){printf("账户已存在!\n");Elemtype_FREE(&data);}else{if(!mods){Insert(&f,data);}else{printf("账户已存在!\n");Elemtype_FREE(&data);}}}break;case '2':{tre_Data(&f,data);BSTree Data;bool mods=BSTree_jian_ce(&f,data,&Data);Elemtype_FREE(&data);if(!mods){Deng_Data(&f,Data);}else{printf("登录失败!\n");}}break;}}else{free(a);FREE_BSTree(&f);return;}system("pause");system("cls");}
}
void Windows(char *argv)
{system("title Math Dash的账户登录程序");system("color f0");if(Windows_mods(argv)){printf("本程序不在文件夹\"numberData\"之中!请将本程序移动到文件夹\"numberData\"之中。\n");system("pause");}else{Windows_system(argv);}
}
int main(int argc, char *argv[])
{Windows(argv[0]);return 0;
}
程序运行如下: