Login.h头文件
#ifndef _LOGIN_H_
#define _LOGIN_H_
#ifndef _STDIO_H_
#define _STDIO_H_
#include<stdio.h>
#endif
#ifndef _STDLIB_H_
#define _STDLIB_H_
#include<stdlib.h>
#endif
#ifndef _STRING_H_
#define _STRING_H_
#include<string.h>
#endif
#define zjlBOOL int
#define YES 0x01
#define NO 0x10
#define SAME 0x11
//权限 三级
#define ONE 0x01 //一级权限
#define TWO 0x02 //二级权限
#define THR 0x03 //三级权限
#define EPT 0X04 //无任何权限
typedef struct _LOGIN_
{
char ad[20]; //Admin
char pw[20]; //Password
int lm; //权限
struct _LOGIN_ *pNext;
}Login,*pLogin;
pLogin pHead = NULL;
Login Admin; //记录登录者
pLogin Create()
{
pLogin p = (pLogin)malloc(sizeof(Login));
p->pNext = NULL;
p->lm = EPT;
return p;
}
/*
作用:注册用户
返回值:YES---添加成功 SAME---用户名一样,不添加
*/
zjlBOOL AddLogin(pLogin pData)
{
pLogin p = pHead;
pLogin pNew = Create();
pNew = pData;
if(!p)
pHead = pNew;
else
{
while(p->pNext)
{
if(!strcmp(p->ad,pData->ad))
return SAME;
p = p->pNext;
}
p->pNext = pNew;
}
return YES;
}
/*
作用:判断输入的用户名是否存在
返回值: YES---存在 NO--不存在 SAME---用户名一样
*/
zjlBOOL IsLogin(pLogin pData)
{
pLogin p = pHead;
while(p)
{
if(!strcmp(p->ad,pData->ad) && !strcmp(p->pw,pData->pw))
{
strcpy(Admin.ad,p->ad);
strcpy(Admin.pw,p->pw);
strcpy(Admin.lm,p->lm);
return YES;
}
p = p->pNext;
}
return NO;
}
/*
参数:pData是用户的用户名、密码
作用:删除单个用户
返回值:YES--删除成功 NO---删除失败
*/
zjlBOOL RemoveAt(pLogin pData)
{
pLogin p = pHead;
if(!strcmp(p->ad,pData->ad) && !strcmp(p->pw,pData->pw))
{
pHead = p->pNext;
free(p);
return YES;
}
while(p->pNext)
{
if(!strcmp(p->pNext->ad,pData->ad) && !strcmp(p->pNext->pw,pData->pw))
{
pLogin s = p->pNext;
pLogin d = s->pNext;
p->pNext = d;
free(s);
return YES;
}
p = p->pNext;
}
return NO;
}
/*
作用:删除所有申请的堆空间
返回值:
*/
void RemoveAll()
{
pLogin p = pHead,d;
while(p)
{
d = p->pNext;
free(p);
p = d;
}
}
/*
作用:获取链表的头指针
返回值:pHead
*/
pLogin GetHead()
{
return pHead;
}
/*
作用:获取登录者
返回值:Login--登录者信息
*/
Login GetLogin()
{
return Admin;
}
/*
作用:保存到文件中
返回值:
*/
void SaveLogin()
{
FILE *file;
pLogin p = pHead;
Login s;
file = fopen("./Login.dat","w");
if(!file || !p)
return ;
while(p)
{
strcpy(s.ad,p->ad);
strcpy(s.pw,p->pw);
s.lm = p->lm;
fwrite(&s,1,sizeof(s),file);
p = p->pNext;
}
fclose(file);
}
/*
作用:读取保存的数据
返回值:
*/
void LoadLogin()
{
FILE *file;
Login s;
file = fopen("./Login.dat","r");
if(!file)
return ;
while(fread(&s,1,sizeof(s),file) == sizeof(Login))
{
pLogin p = pHead;
pLogin pNew = Create();
strcpy(pNew->ad,s.ad);
strcpy(pNew->pw,s.pw);
pNew->lm = s.lm;
if(!p)
pHead = pNew;
else
{
while(p->pNext)
p = p->pNext;
p->pNext = pNew;
}
}
fclose(file);
}
#endif
main.c
#include"Login.h"
#include<stdio.h>
void Init()
{
printf("#========================#\n");
printf("#\t 1、登录\n");
printf("#\t 2、注册\n");
printf("#\t 3、退出\n");
printf("#\t 4、浏览\n");
printf("#\t 5、删除\n");
printf("#========================#\n");
}
void AddMenu()
{
int lm;
int res;
pLogin pNew = Create();
printf("请输入用户名:");
scanf("%s",pNew->ad);
printf("\n请输入密码:");
scanf("%s",pNew->pw);
printf("\n请输入权限【老师(0)、学生(1)】:");
scanf("%d",&lm);
switch(lm)
{
case 0:
pNew->lm = ONE;
break;
case 1:
pNew->lm = TWO;
break;
}
res = AddLogin(pNew);
switch(res)
{
case YES:
printf("添加成功!\n");
break;
case SAME:
printf("用户名一样!\n");
break;
}
}
void ShowAllLogin()
{
char lm[5];
int i = 1;
pLogin p = GetHead();
printf("序号\t用户名\t密码\t权限\n");
while(p)
{
switch(p->lm)
{
case ONE:
strcpy(lm,"老师");
break;
case TWO:
strcpy(lm,"学生");
break;
}
printf("%d\t%s\t%s\t%s\n",i,p->ad,p->pw,lm);
i++;
p = p->pNext;
}
}
void LoginMenu()
{
int res;
pLogin pNew = Create();
printf("请输入用户名:");
scanf("%s",pNew->ad);
printf("\n请输入密码:");
scanf("%s",pNew->pw);
res = IsLogin(pNew);
switch(res)
{
case YES:
printf("登录成功!\n");
printf("登录名:%s\t%s\n",GetLogin().ad,GetLogin().lm);
break;
case NO:
printf("登录失败!\n");
break;
}
}
void RemoveMenu()
{
int res;
pLogin pNew = Create();
printf("请输入用户名:");
scanf("%s",pNew->ad);
printf("\n请输入密码:");
scanf("%s",pNew->pw);
res = RemoveAt(pNew);
switch(res)
{
case YES:
printf("删除成功!\n");
break;
case NO:
printf("删除失败!\n");
break;
}
}
void main()
{
int cmd;
int flag = 1;
LoadLogin();
while(flag)
{
Init();
printf("请输入选择:");
scanf("%d",&cmd);
switch(cmd)
{
case 1:
LoginMenu();
break;
case 2:
AddMenu();
break;
case 3:
flag = 0;
break;
case 4:
ShowAllLogin();
break;
case 5:
RemoveMenu();
break;
}
}
SaveLogin();
RemoveAll();
return ;
}