学生信息管理系统---信息包括学号,姓名,年龄,性别,出生年月,地址,电话,E-mail。功能:信息录入(信息用文件保存),信息浏览,查询,排序,删除和修改

首先是对整体函数所需要的功能进行子函数的分类,让信息的输入,处理,输出,都可以进行模块化的设计.(需要全局代码的可直接下拉至文章末尾.)

******************************************************************************

  文 件 名  : 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里面,,它的功能就是将当前函数的功能挂起一段时间,其单位是毫秒,例如:Sleep(1000),就是让程序挂起来1000ms,也就是1s.

具有类似功能的还有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 或 #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);

}

```

你可能感兴趣的:(学生信息管理系统---信息包括学号,姓名,年龄,性别,出生年月,地址,电话,E-mail。功能:信息录入(信息用文件保存),信息浏览,查询,排序,删除和修改)