自用代码

第一个文件:主控文件(control.h/.c)

#ifndef CONTROL_H_
#define CONTROL_H_
#include"link.h"

/*
    功能:主界面控制函数
    参数:head 链表头节点
    返回值:无
*/
void mainControl(User* head1,Per* head2,Cp* head3);

/*
    功能:实现管理员、公正员注册检测
    参数:空
    返回值:成功注册返回1,失败返回0

*/
void login(User* head1,Per* head2,Cp* head3);

/*
    功能:管理员控制函数
    参数:空
    返回值:无
*/
void adminControl(User* head1,Per* head2,Cp* head3);

/*
    功能:用户控制函数
    参数:空
    返回值:无
*/
void userControl(User* head1,Per* head2,Cp* head3,char*name);

/*
    功能:公正员控制函数
    参数:空
    返回值:无
*/
void workerControl(User* head1,Per* head2,Cp* head3,char* name);

#endif

第二个文件(功能函数文件)

#ifndef FUNC_H_
#define FUNC_H_

#include"link.h"
/*
    功能:在链表尾部插入一个用户的信息
    参数:head 头节点
    返回值:1 成功 0 失败
*/
int insert(User* head1);

/*
    功能:密码隐藏
    参数:空
    返回值:空
*/
void invisualPassWord(char* p);

/*
    功能:去除回车输入
    参数:空
    返回值:字符char(输入的字符)
*/
char getch(void);

/*
    功能:生成验证码
    参数:空
    返回值:空
*/
int verificationCode(void);


/*
    功能:在第三张链表尾部插入一个彩票节点
    参数:head3 头节点
    返回值:1 成功 0 失败
*/
int insert3(Cp* head3);

/*
    功能:在第二张链表尾部插入一个个人彩票节点
    参数:head2 头节点
    返回值:1 成功 0 失败
*/
int insert2(User* head1,Per* head2,Cp* head3,char* name);

/*
    功能:查看用户链表中的信息
    参数:head头文件
    返回值:空
*/
void chatInf(User* head1,char* name);


void printUserLink(User* head1);
void printUserLink2(Per* head2);
void printUserLink3(Cp* head3);
void printUserLink31(Cp* head3,int num);
/*
    功能:修改彩民信息
    参数:头节点、字符串
    返回值:空
*/
void userModifyInf(User* head1,char* name);

/*
    功能:注销当前用户
    参数:用户链表的头节点,用户的姓名
    返回值:空
*/
int deleteUserInf(User* head1,char* name);

/*
    功能:查找用户
    参数:头节点,字符串
    返回值:
*/
int checkInf(User* head1,char* name);

/*
    功能:充值函数
    参数:头节点,字符串
    返回值:1成功充值,0充值失败
*/
int recharge(User* head1,char* name);

/*
    功能:查询奖金
    参数:头节点,字符串
    返回值:1充值成功,0充值失败
*/
int askforPriceInf(Per* head2,char* name);

/*
    功能:购买彩票
    参数:链表二的头节点
    返回值:空
*/
void buyLottary(User* head1,Per* head2,Cp* head3,char* name);

/*
    功能:查询用户信息
    参数:头节点
    返回值:1查到0未查到
*/
int ChatUserInf(User* head1);

/*
    功能:按用户余额进行排序
    参数:头节点
    返回值:空
*/
void sortUserInf(User* head1);

/*
    功能:发布彩票
    参数:链表三的头节点
    返回值:空
*/
void publishLottary(Cp* head3);

/*
    功能:开奖
    参数:彩票发行记录链表头节点
    返回值:空
*/
void openLotarry(User* head1,Per* head2,Cp* head3,char* name);

/*
    功能:查询历史发行记录
    参数:头节点
    返回值:空
*/
void lookforHistoryInf(Cp* head3);

/*
    功能:查询用户购买的彩票信息
    参数:头节点,姓名
    返回值:空
*/
void lookforBuyHistory(Per* head2,char* name);

/*
    功能:小游戏
    参数:空
    返回值:空
*/
void game(void);

#endif

第三个文件(链表文件,及数据保存函数等)

#ifndef LINK_H_
#define LINK_H_

typedef struct user{        //用户
    char usrname[1000];     //用户名
    char usrpwd[1000];      //密码
    int yue;                //余额
}Usr;

typedef struct userlink{
    Usr  user;
    struct userlink* next;
}User;


typedef struct personalCp{  //个人彩票
    int cpIssue;            //发布期号
    int cpId;               //彩票唯一标识ID
    int choiceNum[7];   //彩票选中号码
    char usrname[1000];         //购买者帐号
    int zhushu;             //注数
    int zhongjiangzhuangtai;//中奖状态,1中奖,0未中奖
    int amount;             //中奖金额
}Pcp;

typedef struct personallink{
    Pcp people;
    struct personallink* next;  
}Per;

typedef struct cplottay{    //每期彩票
    int cpIssue1;           //发布期号
    int cost;               //彩票单价
    int kaijiangzhuangtai;  //开奖状态
    int winLottaryNum[7];   //中奖号码
    int sum;                //售出总数
    int sumMoney;           //奖池金额
}Cpl;

typedef struct cplottaryLink{
    Cpl   cpl;
    struct cplottaryLink* next;
}Cp;

/*
    功能:创建用户链表头节点
    参数:空
    返回值:用户链表的指针类型
*/
User* createLink1(void);

/*
    功能:创建用户链表头节点
    参数:空
    返回值:管理员链表的指针类型
*/
Per* creatLink2(void);

/*
    功能:创建公正员链表头节点
    参数:空
    返回值:公正员量表指针类型
*/
Cp* creatLink3(void);


/*
    功能:读取所有的链表
    参数:User*、Per*、Cp*
    返回值:空
*/
/*void loadAllInf(User* head1,Per* head2,Cp* head3);*/

/*
    功能:读取用户登录到内存中
    参数:head 头节点 
    返回值:无
*/
void loadUser(User* head1);

/*
    功能:读取学生信息到内存中
    参数:head 头节点 
    返回值:无
*/
void loadPerson(Per* head2);

/*
    功能:读取学生信息到内存中
    参数:head 头节点 
    返回值:无
*/
void load(Cp* head3);


/*
    功能:添加新节点
    参数:head 头节点 stu 新节点的值域
    返回值:1 成功 0 失败
*/
int insertNewNode1(User* head1,Usr user);

/*
    功能:尾插法,新节点插入第二张表中
    参数:头节点
    返回值:空
*/
void insertNewNode2(Per* head2,Pcp people);

/*
    功能:尾插法,新节点插入第三张表中
    参数:头节点
    返回值:空
*/
int insertNewNode3(Cp* head3,Cpl cpl);

/*
    功能:查询链表中是否存在该节点
    参数:传入字符串,头节点
    返回值:1 成功 0 失败
*/
int check(User* head1, char* name);

/*
    功能:查询链表中是否存在该节点
    参数:head 头节点 id 查找的节点
    返回值:1 成功 0 失败
*/
int checkUserLogin(User* head1, char* name,char* pwd);

/*
    功能:写入用户登录到内存中
    参数:head 头节点 
    返回值:无
*/
void saveUser(User* head1);

/*
    功能:写入个人彩票信息到内存中
    参数:head 头节点 
    返回值:无
*/
void saveUser2(Per* head2);

/*
    功能:写入彩票发行记录到内存中
    参数:head3 头节点 
    返回值:无
*/
void saveUser3(Cp* head3);

/*
    功能:释放所有节点
    参数:表1头节点
    返回值:空
*/
void freeUserLink(User* head1);

/*
    功能:释放所有节点
    参数:表1头节点
    返回值:空
*/
void freePerLink(Per* head2);

/*
    功能:释放所有节点
    参数:表1头节点
    返回值:空
*/
void freeCpLink(Cp* head3);

/*
    功能:释放所有节点
    参数:三张链表的头节点
    返回值:空 
*/
void freeAllLink(User* head1,Per* head2,Cp* head3);


#endif


第四个文件(界面文件):

#ifndef VIEW_H_
#define VIEW_H_

/*
    功能:打印登录注册界面
    参数:空
    返回值:空
*/
void mainMenu(void);

/*
    功能:打印管理员界面
    参数:空
    返回值:空
*/
void adminMenu(void);

/*
    功能:打印用户使用界面
    参数:空
    返回值:空
*/
void userMenu(void);

/*
    功能:打印公正员使用界面
    参数:空
    返回值:空
*/
void workerMenu(void);
#endif

以上均为函数的头文件,对应的.c文件下边自己找(makefile自选):

#include "control.h"
#include "view.h"
#include "func.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define ADMIN "admin"
#define WORKER "worker"
#define PWD "12345"
#define FFLUSH() { while(getchar () != '\n'); }         //缓存清理
#define CONTINUE(X) { while(getchar() != '\n'); printf(X); getchar (); }        //屏幕暂停
/*
    功能:主界面控制函数
    参数:head 链表头节点
    返回值:无
*/
void mainControl(User* head1,Per* head2,Cp* head3)
{
    int choice = 0;
    assert(head1 && head2 && head3);
    while(1){
        system("clear");
        mainMenu();
        scanf("%d",&choice);
        while(getchar() != '\n');
        switch(choice){
            case 1:
                insert(head1);
                printUserLink(head1);
                printUserLink2(head2);
                CONTINUE("回车继续!");
                choice = 0;
                break;
            case 2:
                login(head1,head2,head3);
                choice = 0;
                CONTINUE("回车继续!");
                break;
            case 3:
                printf("期待您的下次光临!\n");
                return;
            default:
                printf("请输入正确的选择!\n");
                break;
        }
    }
}

/*
    功能:实现登录功能
    参数:空
    返回值:成功注册返回1,失败返回0
*/
void login(User* head1,Per* head2,Cp* head3)
{
    assert(head1);
    char name[1000] = {'\0'};
    char pwd[1000] = {'\0'};
    char key[1000] = {'\0'};
    int count = 0;
    printf("请输入帐号(账户设置请勿超过16个字母):\n");
    fgets(name,20,stdin);
    name[strlen(name) - 1] = '\0';
    if((strlen(name) - 1) > 16){
        printf("输入帐号长度超过限制,退出!\n");
        return;
    }
     if(check(head1,name) || !strcmp(name,ADMIN) || !strcmp(name,WORKER)){
        while(1){
            printf("请输入密码(输入字符请勿超出16个):\n");
            invisualPassWord(pwd);
            printf("请再次输入密码:\n");
            invisualPassWord(key);
            if(strlen(pwd) >= 16 || strlen(key) >= 16 || strcmp(key,pwd)){
                printf("输入长度超过限制或密码不统一!!!退出!\n");
                break;
            }
            if(!strcmp(name,ADMIN) && !strcmp(pwd,PWD)){
                adminControl(head1,head2,head3);
                return ;
            }else if(!strcmp(name,WORKER) && !strcmp(pwd,PWD)){
                workerControl(head1,head2,head3,name);
                return ;
            }else if(checkUserLogin(head1,name,pwd)){
                userControl(head1,head2,head3,name);
                return ;
            }else{
                printf("帐号不存在或密码错误!请先注册或重新输入!\n");
                count++;
            }
            if(count == 3){
                printf("密码输入错误三次!退出!\n");
                break;
            }
        }
    }else{
        printf("账户不存在,请先注册!\n");
        return;
    }
    return;
}

/*
    功能:管理员控制函数
    参数:空
    返回值:无
*/
void adminControl(User* head1,Per* head2,Cp* head3)
{
    int choice = 0;
    while(1){
        system("clear");
        adminMenu();
        scanf("%d",&choice);
        switch(choice){
            case 1:
                //开奖
                publishLottary(head3);
                printUserLink3(head3);
                CONTINUE("回车继续!");
                break;
            case 2:
                if(!ChatUserInf(head1)){
                    printf("未查到该用户信息!\n");
                }
                CONTINUE("回车继续!");
                break;
            case 3:
                sortUserInf(head1);
                CONTINUE("回车继续!");
                break;
            case 0:
                return;
        }
    }

}

/*
    功能:用户控制函数
    参数:空
    返回值:无
*/
void userControl(User* head1,Per* head2,Cp* head3,char* name)
{   
    int choice = 0;
    assert(head1 && name && head2);
    while(1){
        system("clear");
        userMenu();
        scanf("%d",&choice);
        switch(choice){
            case 1:
                chatInf(head1,name);
                choice = 0;
                CONTINUE("回车继续!");
                break;
            case 2:
                userModifyInf(head1,name);
                printUserLink(head1);
                choice = 0;
                CONTINUE("回车继续!");
                break;
            case 3:
                if(!deleteUserInf(head1,name)){
                    printf("注销失败!\n");
                    printUserLink(head1);
                }else{
                    printf("注销成功!\n");
                    printUserLink(head1);
                    return;
                }
                choice = 0;
                CONTINUE("回车继续!");
                break;
            case 4:
                //4:        充值 
                if(recharge(head1,name) == 1){
                    printf("充值成功,且行别珍惜!\n");
                }else{
                    printf("充值失败,且行且珍惜!\n");
                }
                choice = 0;
                CONTINUE("回车继续!");
                break;
            case 5:
                //5:        查询中奖记录
                askforPriceInf(head2,name);
                choice = 0;
                CONTINUE("回车继续!");
                break;
            case 6:
                insert2(head1,head2, head3,name);
                choice = 0;
                CONTINUE("回车继续!");
                break;
            case 7:
                lookforBuyHistory(head2,name);
                choice = 0;
                CONTINUE("回车继续!");
                break;
            case 8:
                game();
                CONTINUE("回车继续!");
                break;
            case 0:
                choice = 0;
                return;
            default:
                printf("请输入有效选项的数字!!\n");
                choice = 0;
                CONTINUE("回车继续!");
                break;
        }
    }
}

/*
    功能:公正员控制函数
    参数:空
    返回值:无
*/
void workerControl(User* head1,Per* head2,Cp* head3,char* name)
{
    int choice = 0;
    while(1){
        system("clear");
        workerMenu();
        scanf("%d",&choice);
        switch(choice){
            case 1:
                openLotarry(head1,head2,head3,name);
                CONTINUE("回车继续!");
                break;
            case 2:
                lookforHistoryInf(head3);
                CONTINUE("回车继续!");
                break;
            case 0:
                return;
            default:
                printf("请输入有效选项的数字!!\n");
                CONTINUE("回车继续!");
                break;
        }
    }
}
#include"link.h"
#include"func.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<time.h>
#define ADMIN "admin"
#define WORKER "worker"
#define PWD "12345"
/*
    功能:插入节点至链表1的头节点后,注册
    参数:表一头节点
    返回值:整型
*/
int insert(User* head1)
{
    assert(head1);
    Usr user;
    memset(&user,0, sizeof(Usr));
    int count = 0;
    while(1){   
        printf("请输入真实姓名(输入字符请勿超出16个):\n");
        fgets(user.usrname,30,stdin);
        user.usrname[strlen(user.usrname) - 1] = '\0';
        while(getchar() != '\n');
        if((strlen(user.usrname) - 1)>16){
            printf("输入姓名长度超过限制,重新输入!\n");
            count++;
        }else{
            break;
        }
        if(count ==3){
            printf("输入错误三次!退出!请重新注册!\n");
            return 0;
        }
    }   
    printf("请输入要设置的密码(数字、字符均可,个数小于16个): \n");
    fgets(user.usrpwd,30,stdin);
    user.usrpwd[strlen(user.usrpwd) - 1] = '\0';
    if((strlen(user.usrpwd) - 1)>16){
        printf("输入密码长度超过限制,退出!\n");
        return 0;
    }
    if(!verificationCode()){
        printf("验证失败!\n");
        return 0;
    }else{
        printf("验证成功!\n");
    }
    if(!strcmp(user.usrname,ADMIN) || !strcmp(user.usrname,WORKER)){
        printf("注册失败!\n");
        return 0;
    }
    if(check(head1,user.usrname)){
        printf("账户重名!\n");
        return 0;   
    }else{
        insertNewNode1(head1,user);
    }
    return 0;
}

/*
    功能:密码隐藏
    参数:空
    返回值:空
*/
void invisualPassWord(char* p)
{
    int i = 0;
    char c = '\0';
    while(1){
        c = getch();
        if(c == '\n'){
            *(p + i) = '\0';
            break;
        }else if(c == 127){
            if(i > 0){
                i--;
                printf("\b \b");
            }
        }else{
            *(p + i) = c;
            i++;
            printf("*");
        }
    }
    printf("\n");
}

/*
    功能:去除回车输入
    参数:空
    返回值:字符char(输入的字符)
*/
char getch(void)
{
    system("stty -icanon");
    system("stty -echo");
    char ch = getchar();
    system("stty icanon");
    system("stty echo");
    return ch;
}

/*
    功能:生成验证码
    参数:空
    返回值:空
*/
int verificationCode(void)
{
    char arr[37] = {"abcdefghijklmnopqrstuvwxyz0123456789"};
    char code[5] = {'\0'};
    int i = 0;
    srand(time(NULL));
    for(;i < 4;i++){
        code[i] = arr[rand() % 36];
    }
    printf("请按照显示的验证码进行输入:");
    puts(code);
    char ary[5] = {'\0'};
    printf("请输入验证码:\n");
    scanf("%s",ary);
    if(!strcasecmp(ary,code)){
        return 1;
    }else{
        return 0;
    }
}

/*
    功能:在第二张链表尾部插入一个个人彩票节点,买彩票
    参数:head2 个人彩票头节点、head1信息、head2发行记录
    返回值:1 成功 0 失败
*/
int insert2(User* head1,Per* head2,Cp* head3,char* name)
{
    assert(head1);
    Pcp people;
    memset(&people,0, sizeof(Pcp)); 
    User* p1 = head1->next;
    assert(p1);
    Per* p2 = head2;
    assert(p2);
    Cp* p = head3;
    assert(p);
    int i = 0;
    //记着是给表二创建节点!!!!!!!!!!!!!!!!!!!!!!表1表3找表二资源!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    if(p->next == NULL){
        printf("第一次未发行!\n");
        return 1;
    }
    while(p->next != NULL){
        p = p-> next;
    }
    while(p2->next != NULL){
        p2 = p2 -> next;
    }
    if(p->cpl.kaijiangzhuangtai == 1){
        printf("本期已经开奖,无法继续购买!请等待下次发行!\n");
        return 0;
    }else{
        printf("请输入要购买的彩票号码(7个100以内的数字,数字之间用回车或空格隔开):\n(申明:购买彩票的注数必须小于5注)\n");
        printf("选择号码时每个号码限选一次!重复选择无效!\n");
        for(i = 0;i < 7;){
            printf("第%d个号码:",i+1);
            int ret = scanf("%d",&(people.choiceNum[i]));
            while(getchar() != '\n');
            if(ret == 1){
                i++;
            }else{
                printf("输入有误!重新选号\n");
                return 0;
            }
        }
        printf("请输入要购买的注数:");
        scanf("%d",&(people.zhushu));
        if(people.zhushu > 5){
            printf("购买单张彩票的投注注数应小于5注!购买失败!请重新购买!");
            return 0;
        }
        strcpy(people.usrname,name);
        while(p1 != NULL){//求余额
            if(!strcmp(name,p1->user.usrname)){
                p1->user.yue = p1->user.yue - people.zhushu*(p->cpl.cost);
                if(p1->user.yue < 0){
                    printf("余额不足,请先充值后再来购买!\n");
                    putchar(10);
                    p1->user.yue = 0;
                    return 0;
                }
            }
            p1 = p1->next;
        }
        people.cpIssue = p->cpl.cpIssue1;
        p->cpl.sum = p->cpl.sum + people.zhushu;
        p->cpl.sumMoney += people.zhushu * p->cpl.cost;
        srand(time(NULL));//设置随机数种子
        people.cpId = rand() % 100000;//取一个随机数赋值给变量a(0~9)                      
        insertNewNode2(head2,people);
    }
    printUserLink2(head2);
    return 1;
}
/*
    功能:在第三张链表尾部插入一个彩票节点,管理员对彩票的发行
    参数:head3 彩票发行记录头节点
    返回值:1 成功 0 失败
*/
int insert3(Cp* head3)
{
    assert(head3);
    Cp* p = head3;
    assert(p);
    while(p->next != NULL){
        p = p->next;
    }
    if(head3->next != NULL && p->cpl.kaijiangzhuangtai == 0){
        printf("该期未开奖,不可继续发行\n");
        return 0;
    }

    Cpl cpl;
    memset(&cpl,0,sizeof(Cpl));
    if(p == head3){
        cpl.cpIssue1 = 21001;
    }else{
        cpl.cpIssue1 = p->cpl.cpIssue1 + 1;
    }
    printf("请输入本次彩票的单价:");
    scanf("%d",&cpl.cost);
    if(p == head3){
        cpl.sumMoney = 10000;
    }else{
        cpl.sumMoney = p->cpl.sumMoney;
    }

    insertNewNode3(head3,cpl);
    return 1;
}

/*
    功能:查看用户链表中的信息
    参数:head头文件
    返回值:空
*/
void chatInf(User* head1,char* name)
{
    assert(head1 && name);
    User* p = head1->next;
    assert(p);
    int flag = 1;
    while(p->next!= NULL){
        if(!strcmp(p->user.usrname,name)){
            flag++;
            break;
        }
        p = p->next;
    }
    if(flag){
        printf("您的基本信息为:\n");
        printf("姓名:%s\n密码:%s\n余额:%d\n",p->user.usrname,p->user.usrpwd,p->user.yue);
    }
}

void printUserLink(User* head1)
{
    User* p = head1->next;
    while(p != NULL){
        printf("%10s  %10s %10d\n",p->user.usrname,p->user.usrpwd,p->user.yue);
        p = p->next;
    }
}

void printUserLink2(Per* head2)
{
    /*表er:
    typedef struct personalCp{  //个人彩票
    int cpIssue;            //发布期号
    int cpId;               //彩票唯一标识ID
    int choiceNum[7];   //彩票选中号码
    char usrname[30];           //购买者帐号
    int zhushu;             //注数
    int zhongjiangzhuangtai;//中奖状态,1中奖,0未中奖
    int amount;             //中奖金额
}Pcp;*/
    Per* p = head2->next;
    int i = 0;
    printf("姓名\t\t彩票验证码\t\t中奖状态\t\t期号\t\t注数\t\t中奖金额\t\t\n");
    while(p != NULL){
        printf("%s\t\t\t%d\t\t\t%d\t\t%d\t\t\t%d\t\t\t%d\n",
                p->people.usrname,p->people.cpId,p->people.zhongjiangzhuangtai,
                            p->people.cpIssue,p->people.zhushu,p->people.amount);
        for(i =0 ;i<7;i++){
            printf("%d",p->people.choiceNum[i]);
        }
        putchar(10);
        p = p->next;
    }
}

void printUserLink3(Cp* head3)
{
    Cp* p = head3->next;
    assert(head3);
    while(p != NULL){
    /*int cpIssue1;         //发布期号
    int cost;               //彩票单价
    int kaijiangzhuangtai;  //开奖状态
    int winLottaryNum[7];   //中奖号码
    int sum;                //售出总数
    int sumMoney;           //奖池金额*/
        printf("期号\t\t单价\t\t开奖状态\t售出总数\t奖池金额\t\t开奖号码\t\n");
        printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t"
            ,p->cpl.cpIssue1,p->cpl.cost,p->cpl.kaijiangzhuangtai,p->cpl.sum,p->cpl.sumMoney);
        int i = 0;
        for(i = 0;i < 7;i++){
            printf("%-5d",p->cpl.winLottaryNum[i]);
        }
        printf("\n");
        p = p-> next;
    }
}

void printUserLink31(Cp* head3,int num)
{
    Cp* p = head3->next;
    assert(head3);
    while(p != NULL){
        if(p->cpl.cpIssue1 == num){
            printf("期号\t\t单价\t\t开奖状态\t售出总数\t奖池金额\t\t开奖号码\t\n");
            printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t"
                ,p->cpl.cpIssue1,p->cpl.cost,p->cpl.kaijiangzhuangtai,p->cpl.sum,p->cpl.sumMoney);
            int i = 0;
            for(i = 0;i < 7;i++){
                printf("%-5d",p->cpl.winLottaryNum[i]);
            }
            printf("\n");
            break;
        }else{
            printf("查询信息不存在!\n");
            return;
        }
        p = p-> next;
    }
}

/*
    功能:修改彩民信息
    参数:头节点、字符串
    返回值:空
*/
void userModifyInf(User* head1,char* name)
{
    assert(head1 && name);
    User* p = head1->next;
    assert(p);
    char pwd[30] = {'\0'};
    char pwd1[30] = {'\0'};
    int count = 0;
    while(p->next != NULL){
        if(!strcmp(name,p->user.usrname)){
            break;
        }
        p = p->next;
    }   
    while(1){
        printf("请输入旧密码:");
        scanf("%s",pwd);
        if(!strcmp(pwd,p->user.usrpwd)){
            printf("输入正确!\n");
            break;
        }else{
            printf("输入错误!请重新输入旧密码!\n");
            count++;
            if(count == 3){
                printf("错误三次,退出登录,返回主界面!\n");
                return;
            }
        }
    }
    while(p!= NULL){
        if(!strcmp(p->user.usrname,name)){
            printf("请输入新密码:\n");
            scanf("%s",pwd1);
            if(!strcmp(pwd1,pwd)){
                printf("新旧密码重复!\n");
                break;
            }
            strcpy(p->user.usrpwd,pwd1);
            printf("修改成功!\n");
            break;
        }
        p = p->next;
    }
}

/*
    功能:注销当前用户
    参数:用户链表的头节点,用户的姓名
    返回值:空
*/
int deleteUserInf(User* head1,char* name)
{
    assert(head1 && name);
    if(checkInf(head1,name)){
        int choice = 0;
        printf("确定要注销吗?如果注销,将无法退还账户余额!\n请您慎重考虑,谢谢\n");
        printf("******1.注销********\n");
        printf("******2.取消********\n");
        printf("请按数字键进行选择:");
        scanf("%d",&choice);
        if(choice == 1){
            User* p = head1;//指向头节点的指针p
            assert(p);
            User* delNode = NULL;//空指针  
            while(p->next  != NULL){
                if(!strcmp(p->next->user.usrname,name)){//从头节点的下一个节点开始检查姓名
                    delNode = p->next;//指针指向要删除的节点
                    p->next = p->next->next;//节点指针域指向要删除的节点的下一个节点的地址
                    free(delNode);
                    delNode = NULL;
                    return 1;
                }
                p = p->next;
            }
            return 1;
        }else{
            return 0;
        }
    }
    return 0;
}

/*
    功能:查找用户
    参数:头节点,字符串
    返回值:
*/

int checkInf(User* head1,char* name)
{
    printUserLink(head1);
    assert(head1 && name);
    User* p = head1->next;
    assert(p);
    while(p != NULL){
        if(!strcmp(name,p->user.usrname)){
            return 1;
        }
        p = p->next;
    }
    return 0;
}

/*
    功能:充值函数
    参数:头节点,字符串
    返回值:1成功充值,0充值失败
*/
int recharge(User* head1,char* name)
{
    assert(head1 && name);
    User* p = head1->next;
    assert(p);
    int money = 0;
    int sum = 0;
    while(p  != NULL){
        if(!strcmp(p->user.usrname,name)){
            printf("请输入要充值的金额:");
            scanf("%d",&money);
            if(money < 0){
                printf("充值失败,充值负数不合法!\n");
                return 0;
            }else if(money == 0){
                printf("充值金额不得为0!\n");
                return 0;
            }else{
                sum = p->user.yue + money;
                p->user.yue = sum;
                return 1;
            }
        }
        p = p ->next;
    }
    return 0;
}

/*
    功能:查询中奖记录
    参数:头节点,字符串顾客姓名
    返回值:1中奖,0未中奖
*/
int askforPriceInf(Per* head2,char* name)
{
    assert(head2 && name);
    Per* p = head2;
    assert(p);
    printf("姓名\t\t彩票验证码\t\t中奖状态\t\t期号\n");
    while(p != NULL){
        if(!strcmp(p->people.usrname,name)){
            printf("%s\t\t\t%d\t\t\t%d\t\t%d\t\t\n",
                p->people.usrname,p->people.cpId,p->people.zhongjiangzhuangtai,
                            p->people.cpIssue);
            putchar(10);
        }
        p = p->next;
    }
    return 1;
}
/*
    功能:查询用户信息
    参数:头节点
    返回值:1查到,0未查到
*/
int ChatUserInf(User* head1)
{
    assert(head1);
    printf("请输入要查询的用户的账户(姓名):");
    char name[30] = {'\0'};
    scanf("%s",name);
    User* p = head1->next;
    if(p == NULL){
        return 0;
    }
    while(p != NULL){
        if(!strcmp(p->user.usrname,name)){
            printf("姓名:%s\n密码:******\n余额:%d\n",
                    p->user.usrname,p->user.yue);
            return 1;
        }
        p = p->next;
    }
    return 0;
}

/*
    功能:按用户余额进行排序
    参数:头节点
    返回值:空
*/
void sortUserInf(User* head1)
{
    assert(head1);
    if(NULL == head1->next || NULL == head1->next->next){
        printf("大哥!一个人怎么排?没东西排个锤子!!!\n");       
        return;
    }
    User* p = head1->next;
    assert(p);
    User* q = p;
    assert(q);
    Usr tmp;
    memset(&tmp,0,sizeof(Usr));
    for(p = head1->next;p->next != NULL;p = p->next){
        for(q = p->next;q != NULL;q = q->next){
            if(p->user.yue > q->user.yue){
                tmp = p->user;
                p->user = q->user;
                q->user = tmp;
            }
        }
    }
    printf("恭喜你,排序完成啦!\n");
    printUserLink(head1);
}

/*
    功能:发布彩票//管理员的发行彩票
    参数:链表三的头节点
    返回值:空
*/
void publishLottary(Cp* head3)
{
    printf("发布彩票前请确认您的密码!\n");
    char pwd[30] = {'\0'};
    scanf("%s",pwd);
    if(!strcmp(pwd,"12345")){
        printf("密码正确!\n");
        insert3(head3);
    }else{
        printf("密码不正确!退出!\n");
        return;
    }
}

/*
    功能:开奖
    参数:彩票发行记录链表头节点
    返回值:空
*/
void openLotarry(User* head1,Per* head2,Cp* head3,char* name)
{
    Cp* p = head3;
    User* p1 = head1->next;
    Per* p2 = head2->next;
    char pwd[30] = {'\0'};
    int count = 0;
    int i = 0;
    while(1){
        printf("请输入公正员开奖授权密码:");
        scanf("%s",pwd);
        if(!strcmp(pwd,PWD)){//和宏比较
            printf("输入正确!\n");
            break;
        }else{
            printf("输入错误!请重新输入密码!\n");
            count++;
            if(count == 3){
                printf("密码错误三次,请重新确认后再进行操作!\n");
                return;
            }
        }
    }   
        printf("是否确认开奖?开奖后彩民将无法购买!是否继续?(继续请扣1,退出扣0)\n");
        int choice = 0;
        scanf("%d",&choice);
        switch(choice){
            case 1:
                if(p->next == NULL){
                    printf("第一期都未发行,你开个毛线!\n");
                    return;
                }
                while(p->next != NULL){//遍历第三张链表找到最后一个节点(最新的一期)
                    p = p-> next;
                }
                if(p->cpl.kaijiangzhuangtai == 1){
                    printf("本期已经开奖,切勿重复开奖!\n");
                    return;
                }
                if(p2 == NULL){
                    p->cpl.kaijiangzhuangtai = 1;
                    printf("开奖成功了,但是没人买,大兄弟!\n");
                    return;
                }
                while((p2 != NULL) && (p->cpl.cpIssue1 != p2->people.cpIssue)){//判定期号相等时,移动指针到期号的第一个节点
                    p2 = p2->next;
                }
                if(p2 == NULL){
                    p->cpl.kaijiangzhuangtai = 1;
                    printf("开奖成功了,但是没人买,大兄弟!\n");
                    return;
                }
                /*srand(time(NULL));//设置随机数种子
                for(i = 0;i < 7;i++){//外层控制循环的次数,也就是要产生的随机数个数
                    while(1){
                        a = rand() % 10;//取一个随机数赋值给变量a(0~9)
                        for(j = 0;j < i;j++){//内层检查是否重复
                            if(p->cpl.winLottaryNum[j] == a){//如果对应数组中的元素等于该变量a
                                break;//跳出内层的for循环,继续死循环
                            }
                        }
                        if(j == i){//当位值数等于查重数时
                            p->cpl.winLottaryNum[i] = a;
                            break;
                        }
                    }               
                }*/
                for(i = 0;i <7;i++){
                    p->cpl.winLottaryNum[i] = 1;
                }
                while(p2 != NULL){
                    int flag = 0;
                    p1 = head1->next;
                    for(i = 0;i < 7;i++){
                        if(p->cpl.winLottaryNum[i] == p2->people.choiceNum[i]){
                            flag++;
                        }
                    }
                    while(p1 != NULL){
                        if(!strcmp(p1->user.usrname,p2->people.usrname)){
                            if(flag == 7){
                                p2->people.zhongjiangzhuangtai = 1;
                                p1->user.yue += 100*(p2->people.zhushu);
                                p->cpl.sumMoney -= 100*(p2->people.zhushu);
                                p2->people.amount = 100*(p2->people.zhushu);
                            }else if(flag == 6){
                                p2->people.zhongjiangzhuangtai = 2;
                                p1->user.yue += 50*(p2->people.zhushu);
                                p->cpl.sumMoney -= 50*(p2->people.zhushu);
                                p2->people.amount = 50*(p2->people.zhushu);
                            }else if(flag == 5){
                                p2->people.zhongjiangzhuangtai = 3;
                                p1->user.yue += 25*(p2->people.zhushu);
                                p->cpl.sumMoney -= 25*(p2->people.zhushu);
                                p2->people.amount = 25*(p2->people.zhushu);
                            }else if(flag > 0 && flag < 5){
                                p2->people.zhongjiangzhuangtai = 4;
                                p1->user.yue += 1*(p2->people.zhushu);
                                p->cpl.sumMoney -= 1*(p2->people.zhushu);
                                p2->people.amount = 1*(p2->people.zhushu);                              
                            }else{
                                p2->people.zhongjiangzhuangtai = 0;
                            }
                        }
                        p1 = p1 -> next;
                    }
                    p2 = p2->next;
                }

                printf("开奖已经完成!!可以进行下一次彩票的发售!\n");
                printf("======================================\n");
                p->cpl.kaijiangzhuangtai = 1;//改变节点状态
                break;
            case 0:
                return;
            }
}

/*
    功能:查询历史发行记录
    参数:头节点
    返回值:空
*/
void lookforHistoryInf(Cp* head3)
{
    printf("请按序号选择查询方式:\n");
    printf("*********************\n");
    printf("*1.查询全部历史记录*\n");
    printf("*2.按期号进行查询  *\n");
    printf("*0.退出            *\n");
    printf("*********************\n");
    int choice = 0;
    scanf("%d",&choice);
    int num = 0;
    switch(choice){
        case 1:
            printUserLink3(head3);
            break;
        case 2:
            printf("请输入要查询的期号!\n");
            scanf("%d",&num);
            printUserLink31(head3,num);
            break;
        case 0:
            return;
    }
}

/*
    功能:查询用户购买的彩票信息
    参数:头节点,姓名
    返回值:空
*/
void lookforBuyHistory(Per* head2,char* name)
{
    assert(head2 && name);
    Per* p = head2->next;
    int i = 0;
    if(p == NULL){
        printf("第一期未发行无法查询!\n");
        return;
    }
    printf("姓名\t\t彩票验证码\t\t中奖状态\t\t期号\t\t注数\t\t中奖金额\t\t\n");
    while(p != NULL){
        if(!strcmp(p->people.usrname,name)){
            printf("%s\t\t\t%d\t\t\t%d\t\t%d\t\t\t%d\t\t\t%d\n",
                p->people.usrname,p->people.cpId,p->people.zhongjiangzhuangtai,
                            p->people.cpIssue,p->people.zhushu,p->people.amount);
            for(i =0 ;i<7;i++){
                printf("第%d个号码:%d\n",i+1,p->people.choiceNum[i]);
            }
            putchar(10);
        }
        p = p->next;
    }
}

/*
    功能:小游戏
    参数:空
    返回值:空
*/
void game(void)
{
    int a = 0;
    int b = 0;
    int count = 0;
    int flag = 0;
    printf("欢迎来到陈大饼猜拳小游戏!\n");
    while(1){
        printf("请输入一个数字(0~9):");
        scanf("%d",&a);
        srand(time(NULL));  
        b = rand() % 10;
        printf("%d\n",b);
        if(a > b){
            flag++;
        }else if(a < b){
            count++;
        }else{
            printf("平!\n");
        }
        if(flag == 3){
            printf("你赢了!\n");
            return;
        }
        if(count == 3){
            printf("对不起,你输了!\n");
            return;
        }
    }

}
#include"link.h"
#include"func.h"
#include"view.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
    功能:创建用户链表头节点
    参数:空
    返回值:用户链表的指针类型
*/
User* createLink1(void)
{
    User* head1 = (User*)calloc(1, sizeof(User));
    assert(head1);
    head1->next = NULL;
    return head1;
}

/*
    功能:创建用户链表头节点
    参数:空
    返回值:管理员链表的指针类型
*/
Per* creatLink2(void)
{
    Per* head2 = (Per*)calloc(1, sizeof(Per));
    assert(head2);
    head2->next = NULL;
    return head2;
}

/*
    功能:创建公正员链表头节点
    参数:空
    返回值:公正员量表指针类型
*/
Cp* creatLink3(void)
{
    Cp* head3 = (Cp*)calloc(1, sizeof(Cp));
    assert(head3);
    head3->next = NULL;
    return head3;
}

void loadUser(User* head1)
{
    assert(head1);
    //打开文件
    FILE* fp = fopen("./bin/user.bin", "rb");
    if(fp == NULL){
        system("touch ./bin/user.bin");
        fp = fopen("./bin/user.bin", "rb");
    }
    assert(fp);
    //读取文件
    Usr usr;
    memset(&usr, 0 ,sizeof(Usr));
    while(fread(&usr, sizeof(Usr), 1, fp)){
        insertNewNode1(head1, usr);
    }

    //关闭文件
    fclose(fp);
    fp = NULL;
}
/*
    功能:从文件读取信息到存储区
    参数:head 头节点 
    返回值:无
*/
void loadPerson(Per* head2)
{
    assert(head2);
    //打开文件
    FILE* fp = fopen("./bin/person.bin", "rb");
    if(fp == NULL){
        system("touch ./bin/person.bin");
        fp = fopen("./bin/person.bin", "rb");
        assert(fp);
    }
    //读取文件
    Pcp people;
    memset(&people, 0 ,sizeof(Pcp));
    while(fread(&people, sizeof(Pcp), 1, fp)){
        insertNewNode2(head2,people);
    }

    //关闭文件
    fclose(fp);
    fp = NULL;
}
/*
    功能:从文件读取学生发行记录到内存中
    参数:head 头节点 
    返回值:无
*/
void load(Cp* head3)
{
    assert(head3);
    //打开文件
    FILE* fp = fopen("./bin/cp.bin", "rb");
    if(fp == NULL){
        system("touch ./bin/cp.bin");
        fp = fopen("./bin/cp.bin", "rb");
        assert(fp);
    }
    //读取文件
    Cpl cpl;
    memset(&cpl, 0 ,sizeof(Cpl));
    while(fread(&cpl, sizeof(Cpl), 1, fp)){
        insertNewNode3(head3,cpl);
    }
    //关闭文件
    fclose(fp);
    fp = NULL;
}

/*
    功能:写入用户登录到内存中
    参数:head 头节点 
    返回值:无
*/
void saveUser(User* head1)
{
    assert(head1);
    //打开文件
    FILE* fp = fopen("./bin/user.bin", "wb");
    assert(fp);
    //操作文件
    User* p = head1->next;
    while(p != NULL){
        fwrite(&(p->user),sizeof(Usr),1,fp);
        p = p->next;
    }
    //关闭文件
    fclose(fp);
    fp = NULL;
}


/*
    功能:写入个人彩票信息到内存中
    参数:head 头节点 
    返回值:无
*/
void saveUser2(Per* head2)
{
    assert(head2);
    //打开文件
    FILE* fp = fopen("./bin/person.bin", "wb");
    assert(fp);
    //操作文件
    Per* p = head2->next;
    while(p != NULL){
        fwrite(&(p->people),sizeof(Pcp),1,fp);
        p = p->next;
    }
    //关闭文件
    fclose(fp);
    fp = NULL;
}

/*
    功能:写入发行记录到内存中
    参数:head 头节点 
    返回值:无
*/
void saveUser3(Cp* head3)
{
    assert(head3);
    //打开文件
    FILE* fp = fopen("./bin/cp.bin", "wb");
    assert(fp);
    //操作文件
    Cp* p = head3->next;
    while(p != NULL){
        fwrite(&(p->cpl),sizeof(Cpl),1,fp);
        p = p->next;
    }
    //关闭文件
    fclose(fp);
    fp = NULL;
}

/*
    功能:尾插法,新节点插入第一张表中
    参数:头节点,结构体变量
    返回值:1插入成功
*/
int insertNewNode1(User* head1,Usr user)
{
    assert(head1);
    //新节点的申请
    User* newNode1 = (User*)calloc(1, sizeof(User));
    assert(newNode1);
    newNode1->user = user;
    newNode1->next = NULL;
    User* p = head1;
    while(p->next != NULL){
        p = p->next;
    }
    //链接新节点
    p->next = newNode1;
    return 1;
}

/*
    功能:尾插法,新节点插入第二张表中
    参数:头节点
    返回值:空
*/
void insertNewNode2(Per* head2,Pcp people)
{
    assert(head2);
    //新节点的申请
    Per* newNode2 = (Per*)calloc(1, sizeof(Per));
    assert(newNode2);
    newNode2->people = people;
    newNode2->next = NULL;
    //找到尾节点
    Per* p = head2;
    //链接新节点
    while(p->next != NULL){
        p = p->next;
    }
    p->next = newNode2;
}
/*
    功能:尾插法,新节点插入第三张表中
    参数:头节点,结构体变量
    返回值:1插入成功
*/
int insertNewNode3(Cp* head3,Cpl cpl)
{
    assert(head3);
    //新节点的申请
    Cp* newNode1 = (Cp*)calloc(1, sizeof(Cp));
    assert(newNode1);
    newNode1->cpl = cpl;
    newNode1->next = NULL;
    Cp* p = head3;
    while(p->next != NULL){
        p = p->next;
    }
    p->next = newNode1;
    return 1;
}


/*
    功能:查询链表中是否存在该节点
    参数:head 头节点 id 查找的节点
    返回值:1 成功 0 失败
*/
int check(User* head1, char* name)
{
    assert(head1);
    User* p = head1->next;
    while(p != NULL){
        if(!strcmp(name,p->user.usrname)){
            return 1;
        }
        p = p->next;
    }
    return 0;
}

/*
    功能:查询链表中是否存在该节点
    参数:head 头节点 id 查找的节点
    返回值:1 成功 0 失败
*/
int checkUserLogin(User* head1, char* name,char* pwd)
{
    assert(head1);
    User* p = head1->next;
    while(p != NULL){
        if(!strcmp(name,p->user.usrname)&&!strcmp(pwd,p->user.usrpwd)){
            return 1;
        }
        p = p->next;
    }
    return 0;
}

/*
    功能:释放所有节点
    参数:表1头节点
    返回值:空
*/
void freeUserLink(User* head1)
{
    assert(head1);
    User* p = head1->next;
    User* q = p;
    while(p != NULL){
        q = p->next;
        free(p);
        p = q;  
    }   
    free(head1);
}

/*
    功能:释放所有节点
    参数:表1头节点
    返回值:空
*/
void freePerLink(Per* head2)
{
    assert(head2);
    Per* p = head2->next;
    Per* q = p;
    while(p != NULL){
        q = p->next;
        free(p);
        p = q;  
    }   
    free(head2);
}

/*
    功能:释放所有节点
    参数:表1头节点
    返回值:空
*/
void freeCpLink(Cp* head3)
{
    assert(head3);
    Cp* p = head3->next;
    Cp* q = p;
    while(p != NULL){
        q = p->next;
        free(p);
        p = q;  
    }   
    free(head3);
}

/*
    功能:释放所有节点
    参数:三张链表的头节点
    返回值:空 
*/
void freeAllLink(User* head1,Per* head2,Cp* head3)
{
    freeUserLink(head1);
    freePerLink(head2);
    freeCpLink(head3);
}
#include"link.h"
#include"func.h"
#include"control.h"
#include"view.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    //链表的创建
    User* head1 = createLink1();
    assert(head1);
    Per* head2 = creatLink2();
    assert(head2);
    Cp* head3 = creatLink3();
    assert(head3);

    //读取文件
    loadUser(head1);
    printUserLink(head1);
    loadPerson(head2);
    printUserLink2(head2);
    load(head3);
    printUserLink3(head3);
    //主要逻辑控制
    mainControl(head1,head2,head3);

    //保存文件
    saveUser(head1);
    saveUser2(head2);
    saveUser3(head3);
    //释放所有节点
    freeAllLink(head1,head2,head3);
    return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include"view.h"

/*
    功能:打印登录注册界面
    参数:空
    返回值:空
*/
void mainMenu(void)
{
    printf("\033[;35m***欢迎进入“最坑爹”黑彩票中心***\033[4m\n");
    printf("\033[;31m===============================\033[0m\n");
    putchar(10);
    printf("\033[;32m1:         注册   \033[0m\n");
    putchar(10);
    printf("\033[;33m2:         登录   \033[0m\n");
    putchar(10);
    printf("\033[;34m3:         退出   \033[0m\n");
    putchar(10);
    printf("\033[;35m===============================\033[0m\n");
    printf("\033[;35m*******************************\033[0m\n");
    putchar(10);
    printf("\033[;36m根据系统提示,选择,新用户请先注册:\033[0m\n"); 
}

/*
    功能:打印管理员界面
    参数:空
    返回值:空
*/
void adminMenu(void)
{
    printf("\033[;35m*****欢迎进入“坑爹的”管理员界面****\033[3m\n");
    printf("===============================\n");
    putchar(10);
    printf("1:      发行彩票                \n");
    putchar(10);
    printf("2:      按用户帐号查询           \n");
    putchar(10);
    printf("3:      按用户余额排序           \n");
    putchar(10);
    printf("0:      退出           \n");
    putchar(10);
    printf("===============================\n");
    printf("*******************************\n");
    putchar(10); 
    printf("\033[;35m根据系统提示,选择:\033[0m\n"); 
}

/*
    功能:打印用户使用界面
    参数:空
    返回值:空
*/
void userMenu(void)
{
    printf("*****欢迎进入“最坑爹”用户界面*****\n");
    printf("===============================\n");
    putchar(10);
    printf("1:      查看个人信息             \n");
    putchar(10);
    printf("2:      修改个人信息             \n");
    putchar(10);
    printf("3:      注销个人信息             \n");
    putchar(10);
    printf("4:      充值                    \n");
    putchar(10);
    printf("5:      查询中奖记录             \n");
    putchar(10);
    printf("6:      买买买!!!             \n");
    putchar(10);
    printf("7:      查询购票记录             \n");
    putchar(10);
    printf("8:      陈大饼的羞羞羞             \n");
    putchar(10);
    printf("0:      返回上一级               \n");
    putchar(10);
    printf("===============================\n");
    printf("*******************************\n");
    putchar(10);
    printf("根据系统提示,选择:\n");     
}

void workerMenu(void)
{
    printf("*****欢迎进入“稳坑爹”公正员界面****\n");
    printf("===============================\n");
    putchar(10);
    printf("1:      开奖                \n");
    putchar(10);
    printf("2:      查看历史发行           \n");
    putchar(10);
    printf("0:      返回上一级           \n");
    putchar(10);
    printf("===============================\n");
    printf("*******************************\n");
    putchar(10);
    printf("根据系统提示,选择:\n"); 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值