C语言课程设计-自行车信息管理系统(含完整代码)

一.设计内容

  • 本系统是自行车信息管理系统,主要实现对自行车的编号,及用户姓名,性别,电话号码进行数据的收集、保存、修改、查询、删除并且将自行车信息存入文件等功能。

  • 此外,本系统还为用户设计了登录窗口。用户可通过输入正确密码,成功登录后,便可进入菜单界面,之后就可以根据需求选择相应的功能,其中包括:

文件的读写

录入自行车信息

浏览自行车信息

删除自行车信息

查询自行车信息(包括简单查询和组合查询)

修改自行车信息

自行车信息排序(按照自行车编号或姓名字母排序)

数据统计(包括简单统计和组合统计)

退出系统

二.功能模块图

三.主菜单

代码

//显示菜单的信息 
void menu() 
{

    int select = -1;

    while (select != 0) {
        system("cls");
        printf("\n\n\t\t**************************欢迎使用自行车管理系统***************************");
        printf("\n\t\t\t\t*************请选择功能列表***********");
        printf("\n\n");
        printf("\n\t\t\t\t\t1.录入自行车的信息");
        printf("\n\t\t\t\t\t2.修改自行车的信息");
        printf("\n\t\t\t\t\t3.删除自行车的信息");
        printf("\n\t\t\t\t\t4.查询自行车的信息");
        printf("\n\t\t\t\t\t5.打印自行车的信息");
        printf("\n\t\t\t\t\t6.自行车信息的排序");
        printf("\n\t\t\t\t\t7.插入自行车的信息");
        printf("\n\t\t\t\t\t8.自行车数据的统计");
        printf("\n\t\t\t\t\t0.退   出   菜  单");
        printf("\n\n");
        printf("\n\t\t\t\t***************************************");
        printf("\n\t\t*******************************************************************************");
        printf("\n\n\t\t请选择:");
        scanf("%d", &select);
        switch (select) {
        case 1:
            enter();
            save(filename);
            break;
        case 2:
            modify();
            save(filename);
            break;
        case 3:
            dele();
            iCount--;
            save(filename);
            break;
        case 4:
            search();
            break;
        case 5:
            print();
            break;
        case 6:
            sort();
            break;
        case 7:
            insert();
            save(filename);
            break;
        case 8:
            statistics();
            break;
        case 0:
            break;
        default:
            exit(1);
            break;
        }
    }

四.重点设计及编码

输入密码隐藏化

//密码输入时的隐藏
void cord(char* str)
{
    int i = 0;
    while (1)
    {
        char ch = _getch();            //_getch读取一个字符,但不显示
        if (ch == '\r')                //读取到回车,代表输入完成,加上'\0'
        {
            str[i] = '\0';
            break;
        }
        else if (ch == '\b')        //读取到退格,需要删除一个*,并将光标前移
        {
            i--;                    //删除一个字符
            if (i < 0)  i = 0;
            printf("\b \b");        //\b :删除一个*,\b:光标前移
        }
        else                        //正常输入字符
        {
            str[i] = ch;
            ++i;
            printf("*");            //掩码
        }
    }
}

注意:\b在C程序中是向左移动光标的作用,而不是键盘上的退格,使用printf(“\b \b”),第一个\b将光标移到最后一个*上,再用空格掩盖这个*,再使用\b将光标向前移动,使其不影响后续输入。

在进行掩码时,记得将输入的数值存入字符串之中,并且i++。

在输入结束,接收到’\r’时,给字符串加上’\0’,并且退出循环。

信息的排序

//6.自行车信息的排序
void sort() 
{

    int i, j;
    struct bicycle* pStra, * pMidd;

    int result;
    int select = -1;
    while (select != 0)
    {
        //页面优化
        system("cls");
        printf("\n\n\t\t\t========================6.自行车信息排序========================");
        printf("\n\t\t\t==========请选择功能列表==========\n");
        printf("\t\t\t1.按自行车编号升序排序\n");
        printf("\t\t\t2.按自行车编号降序排序)\n");
        printf("\t\t\t3.按姓名升序排序\n");
        printf("\t\t\t4.按姓名降序排序\n");
        printf("\t\t\t0.退出此页面\n");
        printf("\t\t\t请选择:");
        scanf("%d", &select);

        result = select;
        if (select != 1 && select != 2 && select != 3 && select != 4) return;

        pStra = pHead;
        pMidd = pStra->next;

        for (i=0; i<iCount; i++)
        {
            pStra = pHead;
            pMidd = pStra->next;
            for (j=0; j<iCount-i-1 && pMidd!=NULL; j++)
            {
                if (result == 1) { if (strcmp(pStra->bic_num, pMidd->bic_num) > 0)          exchange(pStra, pMidd); }
                else if (result == 2) { if (strcmp(pStra->bic_num, pMidd->bic_num) < 0)      exchange(pStra, pMidd); }
                else if (result == 3) { if (strcmp(pStra->name, pMidd->name) > 0)    exchange(pStra, pMidd); }
                else if (result == 4) { if (strcmp(pStra->name, pMidd->name) < 0)    exchange(pStra, pMidd); }
                pStra = pMidd;
                pMidd = pMidd->next;
            }
        }

        printf("\t\t\t5.显示排完序后的结果为:\n\n");
        printf("\t\t\t------------------------------------------------------");
        struct bicycle* pTemp;
        int iIndex = 1;

        printf("\n\t\t\t**********本名单中共有%d个自行车信息,所有的信息如下:**********", iCount);
        printf("\n\t\t\t编号\t姓名\t性别\t\t电话\t\t自行车编号");
        pTemp = pHead;

        while (pTemp != NULL) {
            printf("\n\t\t\t%d\t%s\t%s\t\t%s\t\t%s", iIndex, pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
            pTemp = pTemp->next;
            iIndex++;
        }

        printf("\n\t\t\t------------------------------------------------------");
        printf("\n\n\t\t\t排序成功,按任意键返回!");

        getch();
    }

}

可以将两个结点里的信息交换写入一个专门的函数,简化信息排序函数,减少不必要的重复,简化代码,增强代码的可读性。

使用strcmp函数比较两个编号以及姓名的大小,再用交换函数,交换两个的所有值。

注:int strcmp(const char* s1,const char* s2);

当s1<s2时,返回值为负数;当s1=s2时,返回值为0;当s1>s2时,返回值为正数。(即两个字符串从左到右逐个字符比较(按ASCII值大小相比较),直到出现不同的字符或遇到’\0’为止。)

文件的读写

//写入文件
void save(char* fileName)
{
    struct bicycle* pMove = pHead;
    FILE* fp = fopen(fileName, "w");
    while (pMove != NULL) {
        fprintf(fp, "%s %s %s %s\n", pMove->bic_num, pMove->name, pMove->sex, pMove->tele_num);
        pMove = pMove->next;
    }
    fclose(fp);
    return;
}
//读取文件
void read(char* fileName)
{
    struct bicycle* pMove = pHead;
    int i;
    FILE* fp = fopen(fileName, "r");
    if (fp == NULL)
        fp = fopen(fileName, "w");
    while (!feof(fp))
    {
        pMove = (struct bicycle*)malloc(sizeof(struct bicycle));
        fscanf(fp, "%s %s %s %s", pMove->bic_num, pMove->name, pMove->sex, pMove->tele_num);
        if (pMove->tele_num[0] != '1')                //限制电话号码第一位必须为一
            break;
        pMove->next = pHead;
        pHead = pMove;
        pMove = pMove->next;
        iCount++;
    }

    fclose(fp);
}

在写入文件时,首先定义一个文件指针,并且打开将要写入的文件,使用fwrite()函数,将链表中的信息写入文件之中

(2) 文件的读写操作

// 二进制读写

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

文本读写

int fprintf ( FILE * stream, const char * format, ... );

int fscanf ( FILE * stream, const char * format, ... );

注意在这里我们应该使用文本读写

五.部分运行展示

  1. 录入信息

  1. 修改信息

  1. 删除信息

  1. 按照自行车编号降序排序

  1. 查询信息

  1. 统计信息

  1. 文件中内容

六.完整代码

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>

struct bicycle {
    char tele_num[12];//用户的电话号码 
    char name[13];//用户的姓名
    char sex[7];//用户的性别 
    char bic_num[12];//自行车的编号 
    struct bicycle* next;
};


int iCount = 0;                //已经存进的自行车数量
struct bicycle* pHead = NULL;
char filename[20] = "bicycle.txt";

void key();
void cord(char* str);
void menu();
void create();
void enter();
void print();
void insert();
void search();
void dele();
void modify();
void exchange(struct bicycle* pStra, struct bicycle* Midd);
void sort();
void save(char* fileName);
void read(char* fileName);
void statistics();

int main() 
{

    key();
    read(filename);
    menu();
    system("pause");        //按任意键继续

    return 0;
}

//写入文件
void save(char* fileName)
{
    struct bicycle* pMove = pHead;
    FILE* fp = fopen(fileName, "w");
    while (pMove != NULL) {
        fprintf(fp, "%s %s %s %s\n", pMove->bic_num, pMove->name, pMove->sex, pMove->tele_num);
        pMove = pMove->next;
    }
    fclose(fp);
    return;
}
//读取文件
void read(char* fileName)
{
    struct bicycle* pMove = pHead;
    int i;
    FILE* fp = fopen(fileName, "r");
    if (fp == NULL)
        fp = fopen(fileName, "w");
    while (!feof(fp))
    {
        pMove = (struct bicycle*)malloc(sizeof(struct bicycle));
        fscanf(fp, "%s %s %s %s", pMove->bic_num, pMove->name, pMove->sex, pMove->tele_num);
        if (pMove->tele_num[0] != '1')                //限制电话号码第一位必须为一
            break;
        pMove->next = pHead;
        pHead = pMove;
        pMove = pMove->next;
        iCount++;
    }

    fclose(fp);
}

//密码输入时的隐藏
void cord(char* str)
{
    int i = 0;
    while (1)
    {
        char ch = _getch();            //_getch读取一个字符,但不显示
        if (ch == '\r')                //读取到回车,代表输入完成,加上'\0'
        {
            str[i] = '\0';
            break;
        }
        else if (ch == '\b')        //读取到退格,需要删除一个*,并将光标前移
        {
            i--;                    //删除一个字符
            if (i < 0)  i = 0;
            printf("\b \b");        //\b :删除一个*,\b:光标前移
        }
        else                        //正常输入字符
        {
            str[i] = ch;
            ++i;
            printf("*");            //掩码
        }
    }
}


//密码管理页面 
void key() 
{
    char key[20], m[20];
    FILE* k;
    k = fopen("key.txt", "r");
    if (k == NULL)
    {
        k = fopen("key.txt", "w");
        printf("请创建管理密码:");
        cord(key);
        fprintf(k, "%s", key);
        fclose(k);
        printf("恭喜您创建成功!\n");
        getchar();
        printf("按任意键继续...");
        getchar();
        return;
    }
    else
    {
        fscanf(k, "%s", m);
        fclose(k);
        printf("请输入管理密码:");
        cord(key);
        if (strcmp(m, key) == 0)
        {
            printf("密码正确!\n");
            getchar();
            printf("按任意键继续...");
            getchar();
            return;
        }
        else
        {
            printf("密码错误!\n");
            getchar();
            printf("按任意键继续...");
            getchar();
            return;
        }
    }
}

//显示菜单的信息 
void menu() 
{

    int select = -1;

    while (select != 0) {
        system("cls");
        printf("\n\n\t\t**************************欢迎使用自行车管理系统***************************");
        printf("\n\t\t\t\t*************请选择功能列表***********");
        printf("\n\n");
        printf("\n\t\t\t\t\t1.录入自行车的信息");
        printf("\n\t\t\t\t\t2.修改自行车的信息");
        printf("\n\t\t\t\t\t3.删除自行车的信息");
        printf("\n\t\t\t\t\t4.查询自行车的信息");
        printf("\n\t\t\t\t\t5.打印自行车的信息");
        printf("\n\t\t\t\t\t6.自行车信息的排序");
        printf("\n\t\t\t\t\t7.插入自行车的信息");
        printf("\n\t\t\t\t\t8.自行车数据的统计");
        printf("\n\t\t\t\t\t0.退   出   菜  单");
        printf("\n\n");
        printf("\n\t\t\t\t***************************************");
        printf("\n\t\t*******************************************************************************");
        printf("\n\n\t\t请选择:");
        scanf("%d", &select);
        switch (select) {
        case 1:
            enter();
            save(filename);
            break;
        case 2:
            modify();
            save(filename);
            break;
        case 3:
            dele();
            iCount--;
            save(filename);
            break;
        case 4:
            search();
            break;
        case 5:
            print();
            break;
        case 6:
            sort();
            break;
        case 7:
            insert();
            save(filename);
            break;
        case 8:
            statistics();
            break;
        case 0:
            break;
        default:
            exit(1);
            break;
        }
    }


}

//创建链表函数
void create() 
{

    struct bicycle* pEnd = (struct bicycle*)malloc(sizeof(struct bicycle));
    struct bicycle* pNew = (struct bicycle*)malloc(sizeof(struct bicycle));
    struct bicycle* p;

    printf("\n\n\t\t\t请输入存放自行车的信息(退出请按0):\n");
    //录入自行车编号,编号不可以重复
    int flag1 = 1, flag2, n;
    struct bicycle* pTemp;
    printf("\n\t\t\t自行车的编号(退出请按0):");
    scanf("%s", pNew->bic_num);

    while (flag1) {
        if (strcmp(pNew->bic_num, "0") == 0) {        //输入值为零则直接退出循环且不进入下面的循环
            flag1 = 1;
            break;
        }
        else {                        //输入值不为零
            pTemp = pHead;            //初始值为NULL
            n = iCount;                //初始值为零  iCount为已经存入的自行车数量
            flag2 = 1;
            while (n && flag2) {
                if (strcmp(pTemp->bic_num, pNew->bic_num) == 0)
                {
                    flag2 = 0;
                }
                pTemp = pTemp->next;
                n = n - 1;
            }
            if (flag2 == 0) {
                printf("\t\t\t请重新输入,自行车编号%s存在!(退出请按0):\n", pNew->bic_num);
                printf("\t\t\t自行车的编号:");
                scanf("%s", pNew->bic_num);
                flag1 = 1;
            }
            if (flag2 == 1) flag1 = 0;        //满足输入编号不为零且不重复
        }
    }

    //录入其他信息,如果flag1=0,则表明要退出,那么其他信息不用再录
    if (flag1 != 1) {
        printf("\t\t\t姓名:");
        scanf("%s", pNew->name);

        //性别只能输入female或male,否则是不规范的
        while (1) {
            printf("\t\t\t性别(female或male):");
            scanf("%s", pNew->sex);
            if (strcmp(pNew->sex, "female") == 0 || strcmp(pNew->sex, "male") == 0) break;
            else printf("\t\t\t性别输入不规范,请核对后重输!\n");
        }

        //电话必须11位数,否则是不规范的
        while (1) {
            printf("\t\t\t电话(11位数):");
            scanf("%s", pNew->tele_num);
            if (strlen(pNew->tele_num) == 11) break;
            else printf("\t\t\t电话输入不规范,必须11位数!\n");
        }
    }

    while (strcmp(pNew->bic_num, "0") != 0)
    {
        iCount++;                //自行车数量加一

        if (pHead == NULL) {    //将第一个数值存入头结点
            pNew->next = NULL;
            pEnd = pNew;
            pHead = pNew;
        }
        else {
            p = pHead;
            while (p && p->next != NULL) {
                p = p->next;
            }
            p->next = pNew;
            pNew->next = NULL;
        }
        pNew = (struct bicycle*)malloc(sizeof(struct bicycle));
        printf("\n\t\t\t自行车的编号(退出请按0):");
        scanf("%s", pNew->bic_num);
        flag1 = 1;        //每次循环结束flag1=1退出;flag1=0则继续,所以要值0
        while (flag1) {
            if (strcmp(pNew->bic_num, "0") == 0) {
                flag1 = 1;
                break;
            }
            else {
                pTemp = pHead;
                n = iCount;        // n为未对比的自行车的编号数量
                flag2 = 1;
                while (n && flag2) {
                    if (strcmp(pTemp->bic_num, pNew->bic_num) == 0)
                    {
                        flag2 = 0;
                        break;
                    }
                    pTemp = pTemp->next;
                    n = n - 1;
                }
                if (flag2 == 0) {
                    printf("\t\t\t请重新输入,自行车的编号%s存在!(退出请按0):\n", pNew->bic_num);
                    printf("\t\t\t自行车的编号:");
                    scanf("%s", pNew->bic_num);
                    flag1 = 1;
                }
                if (flag2 == 1) flag1 = 0;
            }
        }
        //录入其他信息,如果flag1=0,则表明要退出,那么其他信息不用再录
        if (flag1 != 1) {
            printf("\t\t\t姓名:");
            scanf("%s", pNew->name);

            //性别只能输入female或male,否则是不规范的
            while (1) {
                printf("\t\t\t性别(female或male):");
                scanf("%s", pNew->sex);
                if (strcmp(pNew->sex, "female") == 0 || strcmp(pNew->sex, "male") == 0) break;
                else printf("\t\t\t性别输入不规范,请核对后重输!\n");
            }
            //电话必须11位数,否则是不规范的
            while (1) {
                printf("\t\t\t电话(11位数):");
                scanf("%s", pNew->tele_num);
                if (strlen(pNew->tele_num) == 11) break;
                else printf("\t\t\t电话输入不规范,必须11位数!\n");
            }
        }
    }
    free(pNew);
}

//1.录入自行车信息
void enter()
{
    //页面优化
    system("cls");

    printf("\n\n\t\t\t========================1.录入自行车信息========================");
    create();
    printf("\n\t\t\t录入信息成功,按任意键返回上一级");
    getch();
}

//2.修改自行车的信息
void modify() 
{

    //页面优化
    system("cls");
    printf("\n\n\t\t\t========================2.修改自行车的信息========================");

    int post;
    int flag = 1, flag1;
    char number[12];
    struct bicycle* pTemp = pHead, * pPre = pTemp;

    printf("\n\t\t\t请输入你要修改自行车信息对应自行车的编号:");
    scanf("%s", number);

    while (pTemp != NULL && flag)
    {

        if (strcmp(pTemp->bic_num, number) == 0)
        {
            printf("\t\t\t将要修改的编号%s具体信息如下\n", number);
            printf("\t\t\t姓名\t性别\t\t电话\t\t自行车编号 \n");
            printf("\t\t\t%s\t%s\t\t%s\t\t%s\n", pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
            printf("\n");
            flag = 0;
        }
        pPre = pTemp;//保存pTemp
        pTemp = pTemp->next;
    }

    if (flag == 1)  printf("\t\t\t你要修改的编号%s不存在!", number);
    else
    {
        printf("\t\t\t确认修改请按1,放弃请按任意数字键!\n\t\t\t请选择:");
        scanf("%d", &post);

        while (post == 1)
        {
            printf("\t\t\t请选择你要修改的项目(1.姓名 2.性别 3.电话号码 4.自行车的编号 5.修改全部)\n");
            scanf("%d", &flag1);

            if (flag1 == 1)
            {
                printf("\t\t\t新姓名:");
                scanf("%s", pPre->name);
                printf("\t\t\t修改完成,按任意键退出!");
            }

            else if (flag1 == 2)
            {
                printf("\t\t\t新性别:");
                scanf("%s", pPre->sex);
                printf("\t\t\t修改完成,按任意键退出!");
            }

            else if (flag1 == 3)
            {

                while (1) {
                    printf("\t\t\t电话(11位数):");
                    scanf("%s", pPre->tele_num);
                    if (strlen(pPre->tele_num) == 11) break;
                    else printf("\t\t\t电话输入不规范,必须11位数!\n");
                }

                printf("\t\t\t修改完成,按任意键退出!");
            }

            else if (flag1 == 4)
            {
                printf("\t\t\t新编号:");
                scanf("%d", &pPre->bic_num);
                printf("\t\t\t修改完成,按任意键退出!");
            }

            else {

                printf("\t\t\t新姓名:");
                scanf("%s", pPre->name);

                printf("\t\t\t新性别:");
                scanf("%s", pPre->sex);

                while (1) {
                    printf("\t\t\t电话(11位数):");
                    scanf("%s", pPre->tele_num);
                    if (strlen(pPre->tele_num) == 11) break;
                    else printf("\t\t\t电话输入不规范,必须11位数!\n");
                }

                printf("\t\t\t新编号:");
                scanf("%s", pPre->bic_num);
                printf("\t\t\t修改完成,按任意键退出");

            }
            break;
        }
    }
    getch();
}

//删除信息函数
void dele() 
{
    //页面优化
    system("cls");
    printf("\n\n\t\t\t========================3.删除自行车的信息========================");

    int select = -1;
    while (select != 0) {

        printf("\n\t\t\t==========请选择功能列表==========");
        printf("\n\t\t\t1.按自行车的编号删除");
        printf("\n\t\t\t2.按   姓  名  删 除 ");
        printf("\n\t\t\t0.退出此页面");

        printf("\n\t\t\t请选择:");
        scanf("%d", &select);

        if (select == 0) return;
        else if (select == 1 || select == 2) break;
        else printf("\n\t\t\t输入有误请重新输入\n");
    }

    if (select == 1) {

        if (iCount == 0)  printf("\n\n\t\t\t暂无数据无法进行此操作,按任意键退出!\n");
        else
        {

            char number[12];
            int  i, flag = 1;
            int option;
            struct bicycle* pTemp;
            struct bicycle* pPre;
            pTemp = pHead;

            int iIndex = 0;
            printf("\n\t\t\t请输入要删除自行车的编号:");
            scanf("%s", number);

            while (pTemp != NULL && flag) {
                if (strcmp(pTemp->bic_num, number) == 0) {
                    printf("\n\t\t\t%s找到了,将要删除的信息如下\n\n", number);
                    //显示将要删除人的信息
                    printf("\t\t\t姓名\t性别\t\t电话\t\t自行车编号 \n");
                    printf("\t\t\t%s\t%s\t\t%s\t\t%s\n", pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
                    printf("\n");
                    flag = 0;

                    printf("\t\t\t确认删除请输1,否则按任意数字键退出:");
                    scanf("%d", &option);
                }


                pTemp = pTemp->next;
                iIndex++;
            }
            if (flag == 1) {
                printf("\t\t\t编号%s不存在!", number);
                return;
            }

            if (option == 1) {
                pTemp = pHead;
                pPre = pTemp;//可能多余
                //printf("----------删除第%d个学生----------\n",iIndex);

                if (iIndex != 1)
                {
                    for (i = 1; i < iIndex; i++)
                    {
                        pPre = pTemp;
                        pTemp = pTemp->next;
                    }
                    pPre->next = pTemp->next;
                }
                else    pHead = pTemp->next;
                free(pTemp);
                iCount--;
                printf("\t\t\t删除成功按任意键退出!");
            }
            else  printf("\t\t\t删除失败按任意键退出!");
        }
        getch();
    }
    else {
        if (iCount == 0)  printf("\n\n\t\t\t暂无数据无法进行此操作,按任意键退出!\n");
        else
        {

            char name[12];
            int  i, flag = 1;
            int option;
            struct bicycle* pTemp;
            struct bicycle* pPre;
            pTemp = pHead;

            int iIndex = 0;
            printf("\n\t\t\t请输入要删除自行车对应用户的姓名:");
            scanf("%s", name);

            while (pTemp != NULL && flag) {
                if (strcmp(pTemp->name, name) == 0) {
                    printf("\n\t\t\t%s找到了,将要删除的信息如下\n\n", name);
                    //显示将要删除人的信息
                    printf("\t\t\t姓名\t性别\t\t电话\t\t自行车编号 \n");
                    printf("\t\t\t%s\t%s\t\t%s \t\t%s\n", pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
                    printf("\n");
                    flag = 0;

                    printf("\t\t\t确认删除请输1,否则按任意数字键退出:");
                    scanf("%d", &option);
                }
                pTemp = pTemp->next;
                iIndex++;
            }
            if (flag == 1) {
                printf("\n\t\t\t姓名%s不存在!", name);
                return;
            }

            if (option == 1) {
                pTemp = pHead;
                pPre = pTemp;//可能多余
                //printf("----------删除第%d个学生----------\n",iIndex);

                if (iIndex != 1)
                {
                    for (i = 1; i < iIndex; i++)
                    {
                        pPre = pTemp;
                        pTemp = pTemp->next;
                    }
                    pPre->next = pTemp->next;

                }

                else    pHead = pTemp->next;
                free(pTemp);
                iCount--;
                printf("\t\t\t删除成功按任意键退出!");
            }
            else  printf("\t\t\t删除失败按任意键退出!");
    }
        getch();
    }
}

//信息查询函数
void search() 
{
    int select = -1;
    while (select != 0) {
        //页面优化
        system("cls");
        printf("\n\n\t\t\t========================4.查询自行车的信息========================");
        printf("\n\t\t\t========请选择功能列表========\n");
        printf("\t\t\t1.按自行车的编号查询\n");
        printf("\t\t\t2.按   姓  名  查 询 \n");
        printf("\t\t\t3.按自行车编号及姓名查询 \n");
        printf("\t\t\t0.退出此页面\n");

        printf("\t\t\t请选择:");
        scanf("%d", &select);


        int flag = 1, flag1 = 1;
        char number[12];
        char name[12];
        struct bicycle* pTemp = pHead;

        //按自行车的编号查询
        if (select == 1) {

            printf("\t\t\t请输入你要查找的自行车编号:");
            scanf("%s", number);
            while (pTemp != NULL && flag)
            {
                if (strcmp(pTemp->bic_num, number) == 0)
                {
                    printf("\t\t\t您查找的编号%s找到了,具体信息如下:\n\n", number);

                    printf("\t\t\t姓名\t性别\t\t电话\t\t自行车编号 \n");
                    printf("\t\t\t%s\t%s\t\t%s\t\t%s\n", pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
                    printf("\n");
                    flag = 0;
                }
                pTemp = pTemp->next;
            }
            if (flag == 1)  printf("\t\t\t编号%s不存在!\n", number);
        }

        //按姓名查询
        if (select == 2) {
            printf("\t\t\t请输入你要查找的姓名:");
            scanf("%s", name);
            while (pTemp != NULL && flag)
            {
                if (strcmp(pTemp->name, name) == 0)
                {
                    printf("\t\t\t您查找的姓名%s找到了,具体信息如下\n", name);
                    printf("\t\t\t姓名\t性别\t\t电话\t\t自行车编号 \n");
                    printf("\t\t\t%s\t%s\t\t%s\t\t%s\n", pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
                    printf("\n");
                    flag = 0;
                }
                pTemp = pTemp->next;
            }
            if (flag == 1)  printf("\t\t\t姓名%s不存在!", name);
        }

        //组合查询
        if (select == 3) {
            printf("\t\t\t请输入你要查找的编号及姓名:");
            scanf("%s %s", number, name);
            while (pTemp != NULL && flag)
            {
                if (strcmp(pTemp->bic_num, number) == 0) {
                    if (strcmp(pTemp->name, name) == 0)
                    {
                        printf("\t\t\t您查找的内容找到了,具体信息如下\n");
                        printf("\t\t\t姓名\t性别\t\t电话\t\t自行车编号 \n");
                        printf("\t\t\t%s\t%s\t\t%s\t\t%s\n", pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
                        printf("\n");
                        flag = 0;
                    }
                }
                pTemp = pTemp->next;
            }
            if (flag == 1)  printf("\t\t\t该自行车不存在!\n");
        }
        printf("\t\t\t按任意键返回上一级");
        getch();
    }
}

//输出链表自行车的信息---------5.打印自行车的信息
void print() 
{

    //页面优化
    system("cls");
    printf("\n\n\t\t\t========================5.打印自行车的信息========================");

    struct bicycle* pTemp;
    int iIndex = 1;

    printf("\n\n\t\t\t***************本名单中共有%d个自行车信息,所有的信息如下:***************\n", iCount);
    printf("\t\t\t序号\t姓名\t性别\t\t电话\t\t自行车编号\n");
    pTemp = pHead;

    while (pTemp != NULL) {
        printf("\t\t\t%d\t%s\t%s\t\t%s\t\t%s\n", iIndex, pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
        pTemp = pTemp->next;
        iIndex++;
    }
    printf("\t\t\t按任意键返回上一级");
    getch();
}


//交换函数
void exchange(struct bicycle* pStra, struct bicycle* pMidd) 
{
    int t;
    struct bicycle* pTemp;
    pTemp = (struct bicycle*)malloc(sizeof(struct bicycle));

    strcpy(pTemp->tele_num, pStra->tele_num);
    strcpy(pStra->tele_num, pMidd->tele_num);
    strcpy(pMidd->tele_num, pTemp->tele_num);

    strcpy(pTemp->bic_num, pStra->bic_num);
    strcpy(pStra->bic_num, pMidd->bic_num);
    strcpy(pMidd->bic_num, pTemp->bic_num);

    strcpy(pTemp->name, pStra->name);
    strcpy(pStra->name, pMidd->name);
    strcpy(pMidd->name, pTemp->name);

    strcpy(pTemp->sex, pStra->sex);
    strcpy(pStra->sex, pMidd->sex);
    strcpy(pMidd->sex, pTemp->sex);

    free(pTemp);

}

//6.自行车信息的排序
void sort() 
{

    int i, j;
    struct bicycle* pStra, * pMidd;

    int result;
    int select = -1;
    while (select != 0)
    {
        //页面优化
        system("cls");
        printf("\n\n\t\t\t========================6.自行车信息排序========================");
        printf("\n\t\t\t==========请选择功能列表==========\n");
        printf("\t\t\t1.按自行车编号升序排序\n");
        printf("\t\t\t2.按自行车编号降序排序)\n");
        printf("\t\t\t3.按姓名升序排序\n");
        printf("\t\t\t4.按姓名降序排序\n");
        printf("\t\t\t0.退出此页面\n");
        printf("\t\t\t请选择:");
        scanf("%d", &select);

        result = select;
        if (select != 1 && select != 2 && select != 3 && select != 4) return;

        pStra = pHead;
        pMidd = pStra->next;

        for (i=0; i<iCount; i++)
        {
            pStra = pHead;
            pMidd = pStra->next;
            for (j=0; j<iCount-i-1 && pMidd!=NULL; j++)
            {
                if (result == 1) { if (strcmp(pStra->bic_num, pMidd->bic_num) > 0)          exchange(pStra, pMidd); }
                else if (result == 2) { if (strcmp(pStra->bic_num, pMidd->bic_num) < 0)      exchange(pStra, pMidd); }
                else if (result == 3) { if (strcmp(pStra->name, pMidd->name) > 0)    exchange(pStra, pMidd); }
                else if (result == 4) { if (strcmp(pStra->name, pMidd->name) < 0)    exchange(pStra, pMidd); }
                pStra = pMidd;
                pMidd = pMidd->next;
            }
        }

        printf("\t\t\t5.显示排完序后的结果为:\n\n");
        printf("\t\t\t------------------------------------------------------");
        struct bicycle* pTemp;
        int iIndex = 1;

        printf("\n\t\t\t**********本名单中共有%d个自行车信息,所有的信息如下:**********", iCount);
        printf("\n\t\t\t编号\t姓名\t性别\t\t电话\t\t自行车编号");
        pTemp = pHead;

        while (pTemp != NULL) {
            printf("\n\t\t\t%d\t%s\t%s\t\t%s\t\t%s", iIndex, pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
            pTemp = pTemp->next;
            iIndex++;
        }

        printf("\n\t\t\t------------------------------------------------------");
        printf("\n\n\t\t\t排序成功,按任意键返回!");

        getch();
    }

}

//7.插入自行车的信息
void insert() 
{
    //页面优化
    system("cls");
    printf("\n\n\t\t\t========================7.插入自行车的信息========================\n");
    create();
    printf("\n\t\t\t插入信息成功,按任意键返回上一级");
    getch();
}

//数据的统计
void statistics()
{
    int select = -1;
    while (select != 0) {
        system("cls");
        printf("\n\n\t\t\t========================8.自行车信息统计========================");
        printf("\n\t\t\t==========请选择功能列表==========");
        printf("\n\t\t\t1.统计自行车用户性别");
        printf("\n\t\t\t2.统计全部自行车信息");
        printf("\n\t\t\t0.退出此页面");
        printf("\n\t\t\t请选择:");
        scanf("%d", &select);
        if (select == 1) {
            printf("\n\t\t\t请输入要统计的性别(male/female):");
            int sex_num = 0;
            char sex[10];
            struct bicycle* pTemp;
            pTemp = pHead;
            scanf("%s", sex);
            while (pTemp != NULL) {
                if (strcmp(pTemp->sex, sex) == 0) {
                    printf("\n\t\t\t姓名\t性别\t\t电话\t\t自行车编号");
                    printf("\n\t\t\t%s\t%s\t\t%s\t\t%s", pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
                    sex_num++;
                }
                pTemp = pTemp->next;
            }
            if (sex_num != 0) {
                printf("\n\t\t\t共查询到%d位%s用户", sex_num, sex);
            }
            else printf("\n\t\t\t未查询到%s用户", sex);
            printf("\n\t\t\t按任意键返回上一级");
            getch();
        }
        if (select == 2) {
            struct bicycle* pTemp;
            int iIndex = 1;

            printf("\n\n\t\t\t*****************本名单中共有%d个自行车信息,所有的信息如下:*****************", iCount);
            printf("\n\t\t\t序号\t姓名\t性别\t\t电话\t\t自行车编号");
            pTemp = pHead;

            while (pTemp != NULL) {
                printf("\n\t\t\t%d\t%s\t%s\t\t%s\t\t%s", iIndex, pTemp->name, pTemp->sex, pTemp->tele_num, pTemp->bic_num);
                pTemp = pTemp->next;
                iIndex++;
            }
            printf("\n\t\t\t按任意键返回上一级");
            getch();
        }
    }
}

  • 14
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值