一.设计内容
本系统是自行车信息管理系统,主要实现对自行车的编号,及用户姓名,性别,电话号码进行数据的收集、保存、修改、查询、删除并且将自行车信息存入文件等功能。
此外,本系统还为用户设计了登录窗口。用户可通过输入正确密码,成功登录后,便可进入菜单界面,之后就可以根据需求选择相应的功能,其中包括:
文件的读写
录入自行车信息
浏览自行车信息
删除自行车信息
查询自行车信息(包括简单查询和组合查询)
修改自行车信息
自行车信息排序(按照自行车编号或姓名字母排序)
数据统计(包括简单统计和组合统计)
退出系统
二.功能模块图

三.主菜单

代码
//显示菜单的信息
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, ... );
注意在这里我们应该使用文本读写
五.部分运行展示
录入信息

修改信息

删除信息

按照自行车编号降序排序

查询信息

统计信息

文件中内容

六.完整代码
#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();
}
}
}