首先是对整体函数所需要的功能进行子函数的分类,让信息的输入,处理,输出,都可以进行模块化的设计.(需要全局代码的可直接下拉至文章末尾.)
******************************************************************************
文 件 名 : main.c
版 本 号 : 初稿
作 者 : 飘小叶
生成日期 : 2020年7月14日
最近修改 :
功能描述 : 学生信息管理系统
函数列表 :
* 1. Add_Information 添加学生信息
* 2. Change_Information 修改学生信息
* 3. Delete_Information 删除学生信息
* 4. Head 学生信息管理系统字符图标
* 5. Init 学生信息管理系统初始化字符图标
* 6. isLogin 判断是否登录成功
* 7. Students_Information 学生信息
* 8. Login 登录系统
* 9. main 主函数
* 10. MainMenu 主菜单界面
* 11. MenuSelect 菜单选择
* 12. Quit 退出程序或重新进入主菜单
* 13. Search_Information 查询学生信息
* 14. Show_Information 显示所有学生信息
* 15. Sort_Information 对学生信息进行排序
* 16. StuManage 学生信息管理系统 管理端字符图标
* 17. Swap 交换两个学生信息
* 18. ReadData 读取D:\\下的飘小叶_2220193789.txt文件
* 19. SaveData 将链表中的数据存储在D:\\下的飘小叶_2220193789.txt文件
**设置头文件,宏定义账号:飘小叶,密码2220193789,设置枚举类型,结构体类型,文件操作时所需要的结点,以及各类的子函数声明。**
**在这里需要对枚举类型多说几句,大家可能对于枚举类型比较陌生,枚举类型enum,它所发挥的作用其实和#define相同,但是在进行多次宏定义的时候#define就会显得比较冗杂,于是便引入了枚举类型,例如:**
enum Day
{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};
此时这个Day就是一种新的数据类型,而我的代码中出现的typedef enum Menu{...}MENU,这个其实就是给枚举型起了一个别名(外号).
```c
修改历史 :
1.日 期 : 2020年7月14日
作 者 : 飘小叶
修改内容 : 创建文件
******************************************************************************/
#include
#include
#include
#define MANAGER_NAME "飘小叶" //账号
#define MANAGER_PASSWORD "2220193789" //密码
typedef enum Menu
{
Exit,Lessons,Show,Add,Sort,Change,Delete,Search
}MENU;
typedef struct Student //类型首字母大写以和变量区分
{
int iIndex[50]; //学号
char cName[50]; //姓名
int iOlder[50]; //年龄
char cSex[5]; //性别
char cDatebirth[20]; //出生年月
char cAddress[50]; //地址
int iPhone[20]; //电话
char cMailbox[30]; //邮箱(E-mail)
struct Student *pNext;
}STU,*PSTU;
PSTU pHead = NULL; //学生信息头结点
PSTU pNew = NULL; //待添加学生信息
size_t iCount = 0; //学生总数
char UserName[10]; //用户名(账号)
char UserWord[10]; //密码
void Init(); //学生信息初始化
void MainMenu(); //主菜单界面
void StuManage(); //管理系统 管理端 字符图标
void Head(); //管理系统字符图标
void Login(); //登入系统
int isLogin(); //判断是否登入成功
int MenuSelect(); //菜单选择
void ReadData(); //读取数据
void SaveData(); //保存数据
void Quit(); //退出程序或重新进入主菜单
void Students_Information();
void Show_Information();
void Add_Information();
void Sort_Information();
void Change_Information();
void Delete_Information();
void Search_Information();
void Swap(PSTU stu1,PSTU stu2);
```
**设置主菜单界面,用Switch将其连接起来,首要原因就是Switch相比于近似作用的If来说的话,他的执行效率更高,并且在面向整个菜单界面的时候,分支化操作会使整个界面看起来更加的简洁,易懂。读到这里可能会用到后面几个函数的作用,Head()它就是个表头,起到美化界面的作用,Quit()就如整个注释里面写的那样,他就是一个退出并返回的作用,其次System("cls")冻屏函数,可以让屏幕停止在功能区所在的地方,便于下一步的操作和观察。**
```c
/*****************************************************************************
函 数 名 : MainMenu
功能描述 : 主菜单界面
输入参数 : 无
输出参数 : 无
返 回 值 : void
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2020年7月4日
作 者 : 飘小叶
修改内容 : 新生成函数
*****************************************************************************/
void MainMenu()
{
if (isLogin())
{
//登录成功
switch (MenuSelect()) //菜单选择
{
case Exit: //退出程序
system("cls");
Head(); //管理系统字符图标
Quit(); //退出或返回主菜单
break;
case Lessons: //学生信息
system("cls");
Students_Information();
Quit();
break;
case Show: //显示所有学生信息
system("cls");
Show_Information();
Quit();
break;
case Add: //添加学生信息
system("cls");
Add_Information();
Quit();
break;
case Sort: //对学生信息进行排序
system("cls");
Sort_Information();
Show_Information();
Quit();
break;
case Change: //修改学生信息
system("cls");
Change_Information();
Quit();
break;
case Delete: //删除学生信息
system("cls");
Delete_Information();
Quit();
break;
case Search: //查询学生信息
system("cls");
Search_Information();
Quit();
break;
}
}
}
```
**Init(),就如同他的名字一样,他的作用就是初始化数据,首次登入的话需要将节点置空,初始化整个链表的数据,StuManage()和上面提到过的Head()是类似的作用,也是为了美化界面,而Login()就使用了前面提到过的宏定义账号密码的认定。**
```c
/*****************************************************************************
函 数 名 : Init
功能描述 : 学生信息管理系统初始化字符图标
输入参数 : 无
输出参数 : 无
返 回 值 : void
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2020年7月14日
作 者 : 飘小叶
修改内容 : 新生成函数
*****************************************************************************/
void Init()
{
/****************初始化数据****************/
pHead = (PSTU)malloc(sizeof(STU));
pHead->pNext = NULL;
SetConsoleTitle("学生信息管理系统(管理员)");
ReadData();
/****************载入界面*****************/
printf("欢迎使用本系统!\n");
int i;
printf("\n\n\n\n\n\n\n\n\t\t\t\t\t");
char heihei[] = { "即将进入****大学学生信息管理系统..." };
for (i = 0; i < strlen(heihei); i++)
{
printf("%c", heihei[i]);
Sleep(10);
}
system("cls");
StuManage();
system("cls");
Login();
}
```
**Head()和StuManage()的图像化操作,由几个简单的输出流语句构成。**
```c
//学生信息管理系统字符图标
void Head()
{
printf("\n");
printf("\t\t\t\t\t╭ ? % ╮ ╭ ```╮ \n");
printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 (⌒:⌒)\n");
printf("\t\t\t\t\t(~):(~) (~)v(~) \n");
printf("\n\n\n");
}
//学生信息管理系统 管理端字符图标
void StuManage()
{
printf("\n");
printf("\t\t\t\t\t╭ ? % ╮ ╭ ```╮ \n");
printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 管理端(⌒:⌒)\n");
printf("\t\t\t\t\t(~):(~) (~)v(~) \n");
printf("\n\n\n");
}
```
**登入系统函数,UserName和UseWord是刚开始进行的宏定义,其内的Sleep函数以毫秒为单位,将该函数的进程滞留一段时间进行演示,登陆成功的话,初始化才算是全部完成。
这里再和大家说一下Sleep()函数,Sleep()函数包含在#include
具有类似功能的还有usleep(),其单位是微秒,delay(),他的单位是微秒,但是它的作用是让当前程序的执行暂停一段时间.**
```c
/*****************************************************************************
函 数 名 : Login
功能描述 : 登录系统
输入参数 : 无
输出参数 : 无
返 回 值 : void
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2020年7月14日
作 者 : 飘小叶
修改内容 : 新生成函数
*****************************************************************************/
void Login()
{
StuManage();
char xing[] = { "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " };
for (int i = 0; i { printf("%c", xing[i]); Sleep(10); //让该函数滞留10ms } printf("\n\n\t\t\t\t\t\t请输入您的账号密码:\n\n\n\n\t\t\t\t\t\t账号:"); gets(UserName); //账号 飘小叶 printf("\n\n\t\t\t\t\t\t密码:"); gets(UserWord); //密码 2220193789 } /***************************************************************************** 函 数 名 : isLogin 功能描述 : 判断是否登录成功 输入参数 : 无 输出参数 : 无 返 回 值 : int 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ int isLogin() { int times = 0; //密码输入次数 while (!(strcmp(UserName, MANAGER_NAME) == 0 && strcmp(UserWord, MANAGER_PASSWORD) == 0)) { times++; //密码输入错误 times++ if (times > 3) { printf("\n\n\n\n\t\t\t\t账号或密码输入错误累计达到%d次,系统将于3秒后关闭", times); Sleep(1000); //让该函数滞留1s(1000ms) system("cls"); char shutdown[] = { "系统将于%d秒后关闭..." }; for (int i = 0; i < 3; i++) { printf(shutdown, 3 - i); Sleep(1000); system("cls"); } exit(0); } printf("\n\n\n\n\t\t\t\t账号或密码输入错误,你还有%d次登录机会,按任意键重新登录...", 4 - times); getch(); system("cls"); Login(); } return 1; } ``` **菜单选择界面,直观的让用户选出自己想要的功能,其内的c-‘0’是字符类型转整型的一种方法,用另一种说法来说的话,这个界面就是MainMenu的直观显示,二者的功能可以划=。 这里还需要提的是大家可能不太熟悉的getche() getche() 头文件:#include 该函数用于读取控制台输入的字符,并将输入的字符立即显示在控制台. 参数:该函数没有参数. 返回值:该函数从控制台读取字符,并在控制台显示读取的字符ASCII码值** #include void main() { char ch = getche(); /*读取字符*/ char ch2 = getche(); /*读取字符*/ printf("You put char is %c\n",ch); printf("You put char is %c\n",ch2); system("pause"); return; } 如果用户输入as,则输出结果为: as You put char is a You put char is s 例子运行后输入字符as就会出现这个结果。由于 getche()为阻塞形式运行, 所以在用户没有输入第二个字符的时候会继续等待,直到输入第二个才继续往后面运行, 再次输出用户 输入的字符。与getch()和getchar()对比发现,getche()带回显但是不需要按回车键, 基本介于getch()与getchar()函数功能之间,类似于功能进化过渡形式。 ```c /***************************************************************************** 函 数 名 : MenuSelect 功能描述 : 菜单选择 输入参数 : 无 输出参数 : 无 返 回 值 : int 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ int MenuSelect() { char c; do { system("cls"); Head(); printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n"); printf("\t\t\t\t │ 学生信息管理系统 │\n"); printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n"); printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t │ 1. 学生信息 2. 显示信息 │\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t │ 3. 信息录入 4. 信息排名 │\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t │ 5. 修改信息 6. 删除信息 │\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t │ 7. 查询数据 0. 退出程序 │\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t └────────────────────────────────────────────┘\n"); printf("\t\t\t\t\t\t 请您选择(0-7):"); c = getche(); } while (c < '0' || c > '7'); return c - '0'; } ``` **头插法读取和保存文件信息 这里着重讲一下头插法 ReadData():读文件操作rb,首先考虑容错性将空文件的情况写进循环里面, pNew->pNext = pHead->pNext; pHead->pNext = pNew; pNew = NULL; 这三行代码采用的是建立单链表的头插法,因为使用的头插法,因此新开辟的内存空间需要插入 头指针所指向的下一个地址, 也就是新开辟的 new 需要插入 上一个 New 和 Head 之间。 第一个结点创建之后,Head->Next 的地址是 第一个 New 的地址。 而我们申请到新的一块存储区域后,需要将 New->Next 指向 上一个结点的首地址, 而新创建new 的地址则赋给 pHead->pNext。 因此也就是 pHead -> pNext = pHead -> pNext 。 这样便将第一个结点的地址赋给了新创建地址的 Next 所指向的地址。后两个结点就连接起来。 接下来再将头结点的 Next 所指向的地址赋为 新创建 New 的地址。 pHead->pNext = pNew ,这样就将头结点与新创建的结点连接了起来。 此时最后一个结点,也就是第一次创建的结点的数据域为0,指针域为 NULL。** ```c /***************************************************************************** 函 数 名 : ReadData 功能描述 : 读取文件信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史: 1.日期 : 2020年7月14日 作者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void ReadData() { FILE* fRead = fopen("D:\\飘小叶_2220193789.txt", "rb"); if (fRead == NULL) { SaveData(); //文件不存在就创建文件 return; } rewind(fRead); //将文件内部指针移回文件开头 while (1) { pNew = (PSTU)malloc(sizeof(STU)); //申请一块内存 fread(pNew, sizeof(STU), 1, fRead); //1 表示读取一个STU字节大小单元 if (feof(fRead)) break; //文件末尾退出 //头插法插入数据 pNew->pNext = pHead->pNext; pHead->pNext = pNew; pNew = NULL; iCount++; } Sort_Information(); fclose(fRead); } ``` **SaveData():写文件操作wb,依然是和读文件操作相似的结构, 首先新建指针域pCurrent指向第一个节点 链表可等价于pCurrent 在这里可以引用库函数fwrite() fwrite(pCurrent, sizeof(STU), 1, fWrite); 即取链表的所有数据(长度为stu),从第一位开始依次写入文件内.** ```c /***************************************************************************** 函 数 名 : SaveData 功能描述 : 写入文件信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日期 : 2020年7月14日 作者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void SaveData() { FILE* fWrite = fopen("D:\\飘小叶_2220193789.txt", "wb"); if (fWrite == NULL) { system("cls"); printf("保存失败...\n"); Quit(); } PSTU pCurrent = pHead; //指向第一个节点 如果链表为 NULL //pCurrent为 NULL while (pCurrent->pNext != NULL) //遍历所有学生信息 { fwrite(pCurrent->pNext, sizeof(STU), 1, fWrite); pCurrent = pCurrent->pNext; //指向下一个节点 } pCurrent = NULL; fclose(fWrite); } ``` **同样的Students_Information的图形化界面** ```c /***************************************************************************** 函 数 名 : Students_Information 功能描述 : 课程信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Students_Information() { Head(); printf("\t\t\t╔════════════╦════════════╦════════════╦════════════╦════════════╗\n"); printf("\t\t\t║ 学号 ║ 姓名 ║ 年龄 ║ 性别 ║ 出生年月 ║║地址 ║║电话 ║║邮箱 ║\n"); printf("\t\t\t╚════════════╝════════════╝════════════╝════════════╝════════════╝\n"); } ``` **退出及进入主程序子函数,_exit(0)作为子函数内部退出程序的一种方法与进行主函数退出return 0发挥着近似的作用。** ```c /***************************************************************************** 函 数 名 : Quit 功能描述 : 退出程序或重新进入主菜单 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Quit() { char ch; printf("\n\t "); for (int i = 0; i < 50; i++) { printf("* "); Sleep(10); } printf("\n\n\t\t\t\t要返回登录界面按任意键\t\t退出并保存数据请按Esc键\n"); ch = getch(); if (ch == 0x1b) //esc键按下 { SaveData(); _exit(0); } //重新进入主菜单 MainMenu(); } ``` **通过保存的链表进行遍历来显示所有学生的信息,先以结构体类型来设置新的结点来指向头结点,顺序遍历输出学生信息。** ```c /***************************************************************************** 函 数 名 : Show_Information 功能描述 : 显示所有学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Show_Information() { Head(); PSTU pCurrent = pHead->pNext; //指向第一个节点 如果链表为 NULL pCurrent为 NULL int index = 1; printf("\t\t\t**********************本名单共有 %d 名学生*********************\n\n\n", iCount); printf("\t\t\t ║序号 ║ ║ 学号 ║ 姓名 ║ 年龄 ║ 性别 ║ 出生年月 ║║ 地址 ║║ 电话 ║║ 邮箱 ║\n"); while (pCurrent != NULL) //遍历输出所有学生 { printf("\t\t\t %d\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t%s\n", index, pCurrent->iIndex, pCurrent->cName, pCurrent->iOlder,pCurrent->cSex,pCurrent->cDatebirth , pCurrent->cAddress, pCurrent->iPhone, pCurrent->cMailbox); pCurrent = pCurrent->pNext; //指向下一个节点 index++; //下标加加 } pCurrent = NULL; printf("\n\n\n"); } ``` **因为该学生结构体数组内部的参数都是数组,所以在输入的时候就不需要再使用取地址符,并且 只需要初始化头结点,并不需要设置新的结点去接收他。** ```c /***************************************************************************** 函 数 名 : Add_Information 功能描述 : 添加学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Add_Information() { for (int in = 1; in <= 3; in++) { Sleep(100); printf("."); } system("CLS"); Head(); /************添加学生信息***********/ pNew = (PSTU)malloc(sizeof(STU)); printf("\t\t\t\t\t\t添加学生信息:\n\n\n\n\t\t\t\t\t\t学号:"); scanf("%s", pNew->iIndex); printf("\n\t\t\t\t\t\t姓名:"); scanf("%s", pNew->cName); printf("\n\t\t\t\t\t\t年龄:"); scanf("%s",pNew->iOlder); printf("\n\t\t\t\t\t\t性别:"); scanf("%s",pNew->cSex); printf("\n\t\t\t\t\t\t出生年月:"); scanf("%s", pNew->cDatebirth); printf("\n\t\t\t\t\t\t地址:"); scanf("%s",pNew->cAddress); printf("\n\t\t\t\t\t\t电话:"); scanf("%s",pNew->iPhone); printf("\n\t\t\t\t\t\t邮箱(E-mail):"); scanf("%s",pNew->cMailbox); pNew->pNext = pHead->pNext; pHead->pNext = pNew; pNew = NULL; iCount++; } ``` **设置两个新结点进行接收数据并充当中转站,用冒泡法将以学号为排序标准的学生信息进行排序。** ```c /***************************************************************************** 函 数 名 : Sort_Information 功能描述 : 对学生信息进行排序 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Sort_Information() { if (iCount < 2) //一个学生不需要排序 { return; } //从大到小排序 冒泡排序(利用学号进行排序) PSTU pCurrent,pTemp; STU Temp; for (pCurrent = pHead->pNext; pCurrent != NULL; pCurrent = pCurrent->pNext) { for (pTemp = pCurrent->pNext; pTemp != NULL; pTemp = pTemp->pNext) { if (pCurrent->iIndex < pTemp->iIndex) { Swap(&Temp, pCurrent); Swap(pCurrent, pTemp); Swap(pTemp, &Temp); } } } } ``` **修改学生信息子函数,利用输入的学号进行字符串strcmp的匹配布尔值来筛选出正确的学生信息。** ```c /***************************************************************************** 函 数 名 : Change_Information 功能描述 : 修改学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Change_Information() { Head(); char ID[10]; char operate; printf("\t\t\t\t\t\t修改学生信息:\n\n\n"); printf("\t\t\t\t\t\t请输入学生学号:"); scanf("%s", ID); //遍历学生信息 PSTU pCurrent = pHead; //指向头结点 while (pCurrent-> pNext != NULL) //遍历所有学生 { if (strcmp(pCurrent->pNext ->iIndex, ID) == 0) { printf("\n\n\n\t\t\t\t\t要修改的学生信息...\n\n"); printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n"); printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->pNext->iIndex, pCurrent->pNext->cName, pCurrent->pNext->iOlder , pCurrent->pNext->cSex, pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox); printf("\n\n\n\t\t\t\t\t是否修改该学生信息(y/Enter):"); operate = getch(); if (operate == 'y' || operate == 'Y' || operate == 13) //13是回车键Enter的ASCII值 { printf("\n\n\t\t\t\t\t重新输入学生信息:\n\n\t\t\t\t\t\t学号:"); //默认只可修改数据(可选项) scanf("%s", pCurrent->pNext->iIndex); printf("\n\t\t\t\t\t\t姓名:"); scanf("%s", pCurrent->pNext->cName); printf("\n\t\t\t\t\t\t年龄:"); scanf("%s", &pCurrent->pNext->iOlder); printf("\n\t\t\t\t\t\t性别:"); scanf("%s", &pCurrent->pNext->cSex); printf("\n\t\t\t\t\t\t出生年月:"); scanf("%s", &pCurrent->pNext->cDatebirth); printf("\n\t\t\t\t\t\t地址:"); scanf("%s",&pNew->pNext->cAddress); printf("\n\t\t\t\t\t\t电话:"); scanf("%s",&pNew->pNext->iPhone); printf("\n\t\t\t\t\t\t邮箱(E-mail):"); scanf("%s",&pNew->pNext->cMailbox); printf("\n\n\n\t\t\t\t\t修改成功...\n\n"); pCurrent = NULL; return; } else { printf("\n\n\n\t\t\t\t\t修改失败...\n\n"); return; } return; } pCurrent = pCurrent->pNext; //指向下一个节点 } pCurrent = NULL; printf("\n\n\n\n\t\t\t\t\t 没有找到要查询的学生信息......\n\n"); } ``` **删除学生信息的过程,匹配方式同样是根据字符串strcmp的匹配布尔值来做的,删除的时候直接利用循环结构遍历整个链表来删除元素。** ```c /***************************************************************************** 函 数 名 : Delete_Information 功能描述 : 删除学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Delete_Information() { Head(); char ID[10]; char operate; printf("\t\t\t\t\t\t删除学生信息:\n\n\n"); printf("\t\t\t\t\t\t请输入学生学号:"); scanf("%s", ID); //遍历学生信息 PSTU pCurrent = pHead; //指向头结点 while (pCurrent->pNext != NULL) //遍历输出所有学生 { if (strcmp(pCurrent->pNext->iIndex, ID) == 0) { //信息库里面有要删除的学生信息 printf("\n\n\n\t\t\t\t\t要删除的学生信息...\n\n"); printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n"); printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \t%s\n",pCurrent->pNext->iIndex, pCurrent->pNext->cName, pCurrent->pNext->iOlder, pCurrent->pNext->cSex , pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox); printf("\n\n\n\t\t\t\t\t是否删除该学生信息(y/Enter):"); operate = getch(); if (operate == 'y' || operate == 'Y' || operate == 13) //13是回车键Enter的ASCII值 { //删除学生信息 PSTU pTemp = pCurrent->pNext; //定义PSTU指针 pTemp 指向要删除的节点 pCurrent->pNext = pTemp->pNext; free(pTemp); iCount--; printf("\n\n\n\t\t\t\t\t删除成功...\n\n"); return; } else{ printf("\n\n\n\t\t\t\t\t删除失败...\n\n"); return; } } pCurrent = pCurrent->pNext; //指向下一个节点 } printf("\n\n\n\n\t\t\t\t\t 没有找到要删除的学生信息......\n\n"); } ``` **查询和删除的不同就是它是先遍历链表,在遍历链表的过程中进行匹配,而后输出学生信息.** ```c /***************************************************************************** 函 数 名 : Search_Information 功能描述 : 查询学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Search_Information() { Head(); char ID[10]; printf("\t\t\t\t\t\t查询学生信息:\n\n\n"); printf("\t\t\t\t\t\t请输入学生学号:"); scanf("%s", ID); //遍历学生信息 PSTU pCurrent = pHead->pNext; //指向第一个节点 如果链表为 NULL pCurrent为 NULL while (pCurrent != NULL) //遍历所有学生 { if (strcmp(pCurrent->iIndex, ID) == 0) { printf("\n\n\n\t\t\t\t\t要查询的学生信息...\n\n"); printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n"); printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->iIndex, pCurrent->cName, pCurrent->iOlder , pCurrent->cSex, pCurrent->cDatebirth,pCurrent->cAddress,pCurrent->iPhone,pCurrent->cMailbox); return; } pCurrent = pCurrent->pNext; //指向下一个节点 } pCurrent = NULL; printf("\n\n\n\n\t\t\t\t\t 没有找到要查询的学生信息......\n\n"); } ``` **交换两个学生信息。** ```c /***************************************************************************** 函 数 名 : Swap 功能描述 : 交换两个学生信息(即插入功能) 输入参数 : PSTU stu1 PSTU stu2 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Swap(PSTU stu1, PSTU stu2) { strcpy(stu1->cName, stu2->cName); strcpy(stu1->iIndex, stu2->iIndex); strcpy(stu1->iOlder,stu2->iOlder); strcpy(stu1->cSex,stu2->cSex); strcpy(stu1->cDatebirth,stu2->cDatebirth); strcpy(stu1->cAddress,stu2->cAddress); strcpy(stu1->iPhone,stu2->iPhone); strcpy(stu1->cMailbox,stu2->cMailbox); } ``` 全局代码 ```c /****************************************************************************** ****************************************************************************** 文 件 名 : main.c 版 本 号 : 初稿 作 者 : 飘小叶 生成日期 : 2020年7月14日 最近修改 : 功能描述 : 学生信息管理系统 函数列表 : * * 1. Add_Information 添加学生信息 * 2. Change_Information 修改学生信息 * 3. Delete_Information 删除学生信息 * 4. Head 学生信息管理系统字符图标 * 5. Init 学生信息管理系统初始化字符图标 * 6. isLogin 判断是否登录成功 * 7. Students_Information 学生信息 * 8. Login 登录系统 * 9. main 主函数 * 10. MainMenu 主菜单界面 * 11. MenuSelect 菜单选择 * 12. Quit 退出程序或重新进入主菜单 * 13. Search_Information 查询学生信息 * 14. Show_Information 显示所有学生信息 * 15. Sort_Information 对学生信息进行排序 * 16. StuManage 学生信息管理系统 管理端字符图标 * 17. Swap 交换两个学生信息 * 18. ReadData 读取D:\\下的飘小叶_2220193789.txt文件 * 19. SaveData 将链表中的数据存储在D:\\下的飘小叶_2220193789.txt文件 * 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 创建文件 ******************************************************************************/ #include #include #include #define MANAGER_NAME "飘小叶" //账号 #define MANAGER_PASSWORD "2220193789" //密码 typedef enum Menu { Exit,Lessons,Show,Add,Sort,Change,Delete,Search }MENU; typedef struct Student //类型首字母大写以和变量区分 { int iIndex[50]; //学号 char cName[50]; //姓名 int iOlder[50]; //年龄 char cSex[5]; //性别 char cDatebirth[20]; //出生年月 char cAddress[50]; //地址 int iPhone[20]; //电话 char cMailbox[30]; //邮箱(E-mail) struct Student *pNext; }STU,*PSTU; PSTU pHead = NULL; //学生信息头结点 PSTU pNew = NULL; //待添加学生信息 size_t iCount = 0; //学生总数 char UserName[10]; //用户名(账号) char UserWord[10]; //密码 void Init(); //学生信息初始化 void MainMenu(); //主菜单界面 void StuManage(); //管理系统 管理端 字符图标 void Head(); //管理系统字符图标 void Login(); //登入系统 int isLogin(); //判断是否登入成功 int MenuSelect(); //菜单选择 void ReadData(); //读取数据 void SaveData(); //保存数据 void Quit(); //退出程序或重新进入主菜单 void Students_Information(); void Show_Information(); void Add_Information(); void Sort_Information(); void Change_Information(); void Delete_Information(); void Search_Information(); void Swap(PSTU stu1,PSTU stu2); int main() { Init(); MainMenu(); return 0; } /***************************************************************************** 函 数 名 : MainMenu 功能描述 : 主菜单界面 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月4日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void MainMenu() { if (isLogin()) { //登录成功 switch (MenuSelect()) //菜单选择 { case Exit: //退出程序 system("cls"); Head(); //管理系统字符图标 Quit(); //退出或返回主菜单 break; case Lessons: //学生信息 system("cls"); Students_Information(); Quit(); break; case Show: //显示所有学生信息 system("cls"); Show_Information(); Quit(); break; case Add: //添加学生信息 system("cls"); Add_Information(); Quit(); break; case Sort: //对学生信息进行排序 system("cls"); Sort_Information(); Show_Information(); Quit(); break; case Change: //修改学生信息 system("cls"); Change_Information(); Quit(); break; case Delete: //删除学生信息 system("cls"); Delete_Information(); Quit(); break; case Search: //查询学生信息 system("cls"); Search_Information(); Quit(); break; } } } /***************************************************************************** 函 数 名 : Init 功能描述 : 学生信息管理系统初始化字符图标 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Init() { /****************初始化数据****************/ pHead = (PSTU)malloc(sizeof(STU)); pHead->pNext = NULL; SetConsoleTitle("学生信息管理系统(管理员)"); ReadData(); /****************载入界面*****************/ printf("欢迎使用本系统!\n"); int i; printf("\n\n\n\n\n\n\n\n\t\t\t\t\t"); char heihei[] = { "即将进入****大学学生信息管理系统..." }; for (i = 0; i < strlen(heihei); i++) { printf("%c", heihei[i]); Sleep(10); } system("cls"); StuManage(); system("cls"); Login(); } //学生信息管理系统字符图标 void Head() { printf("\n"); printf("\t\t\t\t\t╭ ? % ╮ ╭ ```╮ \n"); printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 (⌒:⌒)\n"); printf("\t\t\t\t\t(~):(~) (~)v(~) \n"); printf("\n\n\n"); } //学生信息管理系统 管理端字符图标 void StuManage() { printf("\n"); printf("\t\t\t\t\t╭ ? % ╮ ╭ ```╮ \n"); printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 管理端(⌒:⌒)\n"); printf("\t\t\t\t\t(~):(~) (~)v(~) \n"); printf("\n\n\n"); } /***************************************************************************** 函 数 名 : Login 功能描述 : 登录系统 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Login() { StuManage(); char xing[] = { "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " }; for (int i = 0; i { printf("%c", xing[i]); Sleep(10); } printf("\n\n\t\t\t\t\t\t请输入您的账号密码:\n\n\n\n\t\t\t\t\t\t账号:"); gets(UserName); //账号 飘小叶 printf("\n\n\t\t\t\t\t\t密码:"); gets(UserWord); //密码 2220193789 } /***************************************************************************** 函 数 名 : isLogin 功能描述 : 判断是否登录成功 输入参数 : 无 输出参数 : 无 返 回 值 : int 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ int isLogin() { int times = 0; //密码输入次数 while (!(strcmp(UserName, MANAGER_NAME) == 0 && strcmp(UserWord, MANAGER_PASSWORD) == 0)) { times++; //密码输入错误 times++ if (times > 3) { printf("\n\n\n\n\t\t\t\t账号或密码输入错误累计达到%d次,系统将于3秒后关闭", times); Sleep(1000); system("cls"); char shutdown[] = { "系统将于%d秒后关闭..." }; for (int i = 0; i < 3; i++) { printf(shutdown, 3 - i); Sleep(1000); system("cls"); } exit(0); } printf("\n\n\n\n\t\t\t\t账号或密码输入错误,你还有%d次登录机会,按任意键重新登录...", 4 - times); getch(); system("cls"); Login(); } return 1; } /***************************************************************************** 函 数 名 : MenuSelect 功能描述 : 菜单选择 输入参数 : 无 输出参数 : 无 返 回 值 : int 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ int MenuSelect() { char c; do { system("cls"); Head(); printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n"); printf("\t\t\t\t │ 学生信息管理系统 │\n"); printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n"); printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t │ 1. 学生信息 2. 显示信息 │\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t │ 3. 信息录入 4. 信息排名 │\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t │ 5. 修改信息 6. 删除信息 │\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t │ 7. 查询数据 0. 退出程序 │\n"); printf("\t\t\t\t │ │\n"); printf("\t\t\t\t └────────────────────────────────────────────┘\n"); printf("\t\t\t\t\t\t 请您选择(0-7):"); c = getche(); } while (c < '0' || c > '7'); return c - '0'; } /***************************************************************************** 函 数 名 : ReadData 功能描述 : 读取文件信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史: 1.日期 : 2020年7月14日 作者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void ReadData() { FILE* fRead = fopen("D:\\stuInformation.txt", "rb"); if (fRead == NULL) { SaveData(); //文件不存在就创建文件 return; } rewind(fRead); //将文件内部指针移回文件开头 while (1) { pNew = (PSTU)malloc(sizeof(STU)); //申请一块内存 fread(pNew, sizeof(STU), 1, fRead); //1 表示读取一个STU字节大小单元 if (feof(fRead)) break; //文件末尾退出 //头插法插入数据 pNew->pNext = pHead->pNext; pHead->pNext = pNew; pNew = NULL; iCount++; } Sort_Information(); fclose(fRead); } /***************************************************************************** 函 数 名 : SaveData 功能描述 : 写入文件信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日期 : 2020年7月14日 作者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void SaveData() { FILE* fWrite = fopen("D:\\飘小叶_2220193789.txt", "wb"); if (fWrite == NULL) { system("cls"); printf("保存失败...\n"); Quit(); } PSTU pCurrent = pHead; //指向第一个节点 如果链表为 NULL //pCurrent为 NULL while (pCurrent->pNext != NULL) //遍历所有学生信息 { fwrite(pCurrent->pNext, sizeof(STU), 1, fWrite); pCurrent = pCurrent->pNext; //指向下一个节点 } pCurrent = NULL; fclose(fWrite); } /***************************************************************************** 函 数 名 : Students_Information 功能描述 : 课程信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Students_Information() { Head(); printf("\t\t\t╔════════════╦════════════╦════════════╦════════════╦════════════╗\n"); printf("\t\t\t║ 学号 ║ 姓名 ║ 年龄 ║ 性别 ║ 出生年月 ║║地址 ║║电话 ║║邮箱 ║\n"); printf("\t\t\t╚════════════╝════════════╝════════════╝════════════╝════════════╝\n"); } /***************************************************************************** 函 数 名 : Quit 功能描述 : 退出程序或重新进入主菜单 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Quit() { char ch; printf("\n\t "); for (int i = 0; i < 50; i++) { printf("* "); Sleep(10); } printf("\n\n\t\t\t\t要返回登录界面按任意键\t\t退出并保存数据请按Esc键\n"); ch = getch(); if (ch == 0x1b) //esc键按下 { SaveData(); _exit(0); } //重新进入主菜单 MainMenu(); } /***************************************************************************** 函 数 名 : Show_Information 功能描述 : 显示所有学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Show_Information() { Head(); PSTU pCurrent = pHead->pNext; //指向第一个节点 如果链表为 NULL pCurrent为 NULL int index = 1; printf("\t\t\t**********************本名单共有 %d 名学生*********************\n\n\n", iCount); printf("\t\t\t ║序号 ║ ║ 学号 ║ 姓名 ║ 年龄 ║ 性别 ║ 出生年月 ║║ 地址 ║║ 电话 ║║ 邮箱 ║\n"); while (pCurrent != NULL) //遍历输出所有学生 { printf("\t\t\t %d\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t%s\n", index, pCurrent->iIndex, pCurrent->cName, pCurrent->iOlder,pCurrent->cSex,pCurrent->cDatebirth , pCurrent->cAddress, pCurrent->iPhone, pCurrent->cMailbox); pCurrent = pCurrent->pNext; //指向下一个节点 index++; //下标加加 } pCurrent = NULL; printf("\n\n\n"); } /***************************************************************************** 函 数 名 : Add_Information 功能描述 : 添加学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Add_Information() { for (int in = 1; in <= 3; in++) { Sleep(100); printf("."); } system("CLS"); Head(); /************添加学生信息***********/ pNew = (PSTU)malloc(sizeof(STU)); printf("\t\t\t\t\t\t添加学生信息:\n\n\n\n\t\t\t\t\t\t学号:"); scanf("%s", pNew->iIndex); printf("\n\t\t\t\t\t\t姓名:"); scanf("%s", pNew->cName); printf("\n\t\t\t\t\t\t年龄:"); scanf("%s",pNew->iOlder); printf("\n\t\t\t\t\t\t性别:"); scanf("%s",pNew->cSex); printf("\n\t\t\t\t\t\t出生年月:"); scanf("%s", pNew->cDatebirth); printf("\n\t\t\t\t\t\t地址:"); scanf("%s",pNew->cAddress); printf("\n\t\t\t\t\t\t电话:"); scanf("%s",pNew->iPhone); printf("\n\t\t\t\t\t\t邮箱(E-mail):"); scanf("%s",pNew->cMailbox); pNew->pNext = pHead->pNext; pHead->pNext = pNew; pNew = NULL; iCount++; } /***************************************************************************** 函 数 名 : Sort_Information 功能描述 : 对学生信息进行排序 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Sort_Information() { if (iCount < 2) //一个学生不需要排序 { return; } //从大到小排序 冒泡排序(利用学号进行排序) PSTU pCurrent,pTemp; STU Temp; for (pCurrent = pHead->pNext; pCurrent != NULL; pCurrent = pCurrent->pNext) { for (pTemp = pCurrent->pNext; pTemp != NULL; pTemp = pTemp->pNext) { if (pCurrent->iIndex < pTemp->iIndex) { Swap(&Temp, pCurrent); Swap(pCurrent, pTemp); Swap(pTemp, &Temp); } } } } /***************************************************************************** 函 数 名 : Change_Information 功能描述 : 修改学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Change_Information() { Head(); char ID[10]; char operate; printf("\t\t\t\t\t\t修改学生信息:\n\n\n"); printf("\t\t\t\t\t\t请输入学生学号:"); scanf("%s", ID); //遍历学生信息 PSTU pCurrent = pHead; //指向头结点 while (pCurrent-> pNext != NULL) //遍历所有学生 { if (strcmp(pCurrent->pNext ->iIndex, ID) == 0) { printf("\n\n\n\t\t\t\t\t要修改的学生信息...\n\n"); printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n"); printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->pNext->iIndex, pCurrent->pNext->cName, pCurrent->pNext->iOlder , pCurrent->pNext->cSex, pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox); printf("\n\n\n\t\t\t\t\t是否修改该学生信息(y/Enter):"); operate = getch(); if (operate == 'y' || operate == 'Y' || operate == 13) //13是回车键Enter的ASCII值 { printf("\n\n\t\t\t\t\t重新输入学生信息:\n\n\t\t\t\t\t\t学号:"); //默认只可修改数据(可选项) scanf("%s", pCurrent->pNext->iIndex); printf("\n\t\t\t\t\t\t姓名:"); scanf("%s", pCurrent->pNext->cName); printf("\n\t\t\t\t\t\t年龄:"); scanf("%s", &pCurrent->pNext->iOlder); printf("\n\t\t\t\t\t\t性别:"); scanf("%s", &pCurrent->pNext->cSex); printf("\n\t\t\t\t\t\t出生年月:"); scanf("%s", &pCurrent->pNext->cDatebirth); printf("\n\t\t\t\t\t\t地址:"); scanf("%s",&pNew->pNext->cAddress); printf("\n\t\t\t\t\t\t电话:"); scanf("%s",&pNew->pNext->iPhone); printf("\n\t\t\t\t\t\t邮箱(E-mail):"); scanf("%s",&pNew->pNext->cMailbox); printf("\n\n\n\t\t\t\t\t修改成功...\n\n"); pCurrent = NULL; return; } else { printf("\n\n\n\t\t\t\t\t修改失败...\n\n"); return; } return; } pCurrent = pCurrent->pNext; //指向下一个节点 } pCurrent = NULL; printf("\n\n\n\n\t\t\t\t\t 没有找到要查询的学生信息......\n\n"); } /***************************************************************************** 函 数 名 : Delete_Information 功能描述 : 删除学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Delete_Information() { Head(); char ID[10]; char operate; printf("\t\t\t\t\t\t删除学生信息:\n\n\n"); printf("\t\t\t\t\t\t请输入学生学号:"); scanf("%s", ID); //遍历学生信息 PSTU pCurrent = pHead; //指向头结点 while (pCurrent->pNext != NULL) //遍历输出所有学生 { if (strcmp(pCurrent->pNext->iIndex, ID) == 0) { //信息库里面有要删除的学生信息 printf("\n\n\n\t\t\t\t\t要删除的学生信息...\n\n"); printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n"); printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \t%s\n",pCurrent->pNext->iIndex, pCurrent->pNext->cName, pCurrent->pNext->iOlder, pCurrent->pNext->cSex , pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox); printf("\n\n\n\t\t\t\t\t是否删除该学生信息(y/Enter):"); operate = getch(); if (operate == 'y' || operate == 'Y' || operate == 13) //13是回车键Enter的ASCII值 { //删除学生信息 PSTU pTemp = pCurrent->pNext; //定义PSTU指针 pTemp 指向要删除的节点 pCurrent->pNext = pTemp->pNext; free(pTemp); iCount--; printf("\n\n\n\t\t\t\t\t删除成功...\n\n"); return; } else{ printf("\n\n\n\t\t\t\t\t删除失败...\n\n"); return; } } pCurrent = pCurrent->pNext; //指向下一个节点 } printf("\n\n\n\n\t\t\t\t\t 没有找到要删除的学生信息......\n\n"); } /***************************************************************************** 函 数 名 : Search_Information 功能描述 : 查询学生信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Search_Information() { Head(); char ID[10]; printf("\t\t\t\t\t\t查询学生信息:\n\n\n"); printf("\t\t\t\t\t\t请输入学生学号:"); scanf("%s", ID); //遍历学生信息 PSTU pCurrent = pHead->pNext; //指向第一个节点 如果链表为 NULL pCurrent为 NULL while (pCurrent != NULL) //遍历所有学生 { if (strcmp(pCurrent->iIndex, ID) == 0) { printf("\n\n\n\t\t\t\t\t要查询的学生信息...\n\n"); printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n"); printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->iIndex, pCurrent->cName, pCurrent->iOlder , pCurrent->cSex, pCurrent->cDatebirth,pCurrent->cAddress,pCurrent->iPhone,pCurrent->cMailbox); return; } pCurrent = pCurrent->pNext; //指向下一个节点 } pCurrent = NULL; printf("\n\n\n\n\t\t\t\t\t 没有找到要查询的学生信息......\n\n"); } /***************************************************************************** 函 数 名 : Swap 功能描述 : 交换两个学生信息(即插入功能) 输入参数 : PSTU stu1 PSTU stu2 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年7月14日 作 者 : 飘小叶 修改内容 : 新生成函数 *****************************************************************************/ void Swap(PSTU stu1, PSTU stu2) { strcpy(stu1->cName, stu2->cName); strcpy(stu1->iIndex, stu2->iIndex); strcpy(stu1->iOlder,stu2->iOlder); strcpy(stu1->cSex,stu2->cSex); strcpy(stu1->cDatebirth,stu2->cDatebirth); strcpy(stu1->cAddress,stu2->cAddress); strcpy(stu1->iPhone,stu2->iPhone); strcpy(stu1->cMailbox,stu2->cMailbox); } ```