基本要求:利用链式结构完成班级学生信息的一般性管理工作。其中,每条记录至少包括学号,姓名,性别,出生年月,手机号,QQ,微信,简介等信息。 (1)学生信息的增删改查功能; (2)学生信息的排序输出功能。 (3)设计实现菜单方式的交互界面,演示程序以用户和计算机的对话方式进行,可反复操作。
<span class="hljs-comment">#include"stdio.h"</span>
<span class="hljs-comment">#include"conio.h"</span>
<span class="hljs-comment">#include"string.h"</span>
<span class="hljs-comment">#include"stdlib.h" </span>
<span class="hljs-comment">#include"time.h"</span>
<span class="hljs-comment">#define NULL 0</span>
typedef struct student <span class="hljs-comment">//结构体数据类型定义</span>
{
<span class="hljs-keyword">int</span> num; <span class="hljs-comment">//学号</span>
char name[<span class="hljs-number">18</span>]; <span class="hljs-comment">//姓名</span>
char sex; <span class="hljs-comment">//性别</span>
<span class="hljs-keyword">int</span> age; <span class="hljs-comment">//年龄</span>
<span class="hljs-keyword">int</span> y,m; <span class="hljs-comment">//年月</span>
<span class="hljs-keyword">int</span> tel; <span class="hljs-comment">//电话</span>
char add[<span class="hljs-number">30</span>]; <span class="hljs-comment">//地址</span>
char mail[<span class="hljs-number">20</span>]; <span class="hljs-comment">//电子邮件 </span>
struct student *next; <span class="hljs-comment">//地址指针</span>
}SDate;
<span class="hljs-keyword">void</span> Info_Print(SDate *p); <span class="hljs-comment">//数据输出--屏幕</span>
SDate *Info_Add(SDate *p); <span class="hljs-comment">//链表创建及数据添加</span>
SDate *Info_Del(SDate *head); <span class="hljs-comment">//数据删除</span>
SDate *Info_Short(SDate *head); <span class="hljs-comment">//数据排序</span>
SDate *Input_file(SDate *head); <span class="hljs-comment">//数据输入--文件</span>
SDate *Info_Change(SDate *head) ; <span class="hljs-comment">//数据修改</span>
<span class="hljs-keyword">void</span> Info_Serach(SDate *head,<span class="hljs-keyword">int</span> choice) ; <span class="hljs-comment">//数据查找</span>
<span class="hljs-keyword">void</span> Print_file(SDate *head) ; <span class="hljs-comment">//数据输出--文件</span>
<span class="hljs-keyword">void</span> <span class="hljs-keyword">Exit</span>(); <span class="hljs-comment">//退出程序 </span>
<span class="hljs-keyword">int</span> Info_Logins() ; <span class="hljs-comment">//登录程序</span>
<span class="hljs-keyword">void</span> Menu(); <span class="hljs-comment">//主菜单</span>
<span class="hljs-keyword">int</span> Input_Choice(); <span class="hljs-comment">//数据输入方式选择</span>
<span class="hljs-keyword">int</span> main()
{
<span class="hljs-keyword">int</span> ret=<span class="hljs-number">0</span>,res=<span class="hljs-number">0</span>,choice=<span class="hljs-number">0</span>;
char ch;
SDate *head=(SDate *)malloc(sizeof(SDate)); <span class="hljs-comment">//定义信息表头并分配空间</span>
<span class="hljs-keyword">if</span>(head==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//若分配失败,则结束程序</span>
{
printf(<span class="hljs-string">"内存分配失败!"</span>);
<span class="hljs-keyword">exit</span>(<span class="hljs-number">0</span>);
}
head->next=<span class="hljs-literal">NULL</span>; <span class="hljs-comment">//使头指针初始为空</span>
loop:ret=Info_Logins(); <span class="hljs-comment">//登录函数 默认密码为admin</span>
<span class="hljs-keyword">if</span>(!ret) <span class="hljs-comment">//利用登录函数返回值验证权限</span>
{
printf(<span class="hljs-string">"\n\n\t 密码错误或验证码错误\n"</span>); <span class="hljs-comment">//若返回0则提示错误 </span>
system(<span class="hljs-string">"pause"</span>);
system(<span class="hljs-string">"cls"</span>); <span class="hljs-comment">//清除当前屏幕上的所有内容 </span>
<span class="hljs-keyword">goto</span> loop; <span class="hljs-comment">//并重新输入登录数据</span>
}
system(<span class="hljs-string">"cls"</span>); <span class="hljs-comment">//清除当前屏幕上的所有内容</span>
e:Menu(); <span class="hljs-comment">//菜单显示函数调用</span>
printf(<span class="hljs-string">"您的选择是?"</span>);
scanf(<span class="hljs-string">"%d"</span>,&ret);
printf(<span class="hljs-string">"\n当前位置:"</span>); <span class="hljs-comment">//打印输出当前用户选择的步骤</span>
<span class="hljs-keyword">switch</span>(ret)
{
<span class="hljs-keyword">case</span> <span class="hljs-number">1</span>: <span class="hljs-comment">//进入【数据输入模块】</span>
lab:choice=Input_Choice(); <span class="hljs-comment">//InputChoice()为数据输入方式选择函数</span>
<span class="hljs-comment">//提示用户是选择键盘录入,还是文件读取?</span>
<span class="hljs-keyword">if</span>(choice==<span class="hljs-number">1</span>) <span class="hljs-comment">//利用其返回值判断用户选项</span>
{
printf(<span class="hljs-string">"->学生信息录入--键盘录入\n\n"</span>);
head=Info_Add(head); <span class="hljs-comment">//数据输入--键盘函数调用</span>
}
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(choice==<span class="hljs-number">2</span>)
{
printf(<span class="hljs-string">"->学生信息录入--文件录入\n\n"</span>);
head=Input_file(head); <span class="hljs-comment">//数据输入--文件函数调用</span>
}
<span class="hljs-keyword">else</span> <span class="hljs-comment">//如果用户输入数据不对,则返回重新输入</span>
{
system(<span class="hljs-string">"cls"</span>); <span class="hljs-comment">//清除当前屏幕上所有内容</span>
<span class="hljs-keyword">goto</span> e; <span class="hljs-comment">//跳转至选择输入位置</span>
}
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">2</span>: <span class="hljs-comment">//进入【数据输出--屏幕模块】</span>
printf(<span class="hljs-string">"->学生信息输出\n\n"</span>);
<span class="hljs-keyword">if</span>(head->next==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//判断是否有数据输出</span>
printf(<span class="hljs-string">"没有数据需要输出!\n"</span>);
<span class="hljs-keyword">else</span>
Info_Print(head); <span class="hljs-comment">//数据输出--屏幕函数调用</span>
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">3</span>: <span class="hljs-comment">//进入【数据排序模块】</span>
printf(<span class="hljs-string">"->学生信息排序\n\n"</span>);
<span class="hljs-keyword">if</span>(head->next==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//判断是否有数据排序</span>
printf(<span class="hljs-string">"没有需要进行排序的数据!\n"</span>);
<span class="hljs-keyword">else</span>
head=Info_Short(head);<span class="hljs-keyword">break</span>; <span class="hljs-comment">//数据排序函数调用</span>
<span class="hljs-keyword">case</span> <span class="hljs-number">4</span>: <span class="hljs-comment">//进入【数据查询模块】</span>
printf(<span class="hljs-string">"->学生信息查询\n\n"</span>);
<span class="hljs-keyword">if</span>(head->next==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//判断是存在数据进行查询</span>
{
printf(<span class="hljs-string">"没有数据进行查询,是否创建?Y/N:"</span>);
<span class="hljs-comment">//如果不存在数据,则提示用户是否新建</span>
getchar();
scanf(<span class="hljs-string">"%c"</span>,&ch);
<span class="hljs-keyword">if</span>(ch==<span class="hljs-string">'Y'</span>||ch==<span class="hljs-string">'y'</span>) <span class="hljs-comment">//如果用户同意新建,则跳转至【数据输入模块】</span>
<span class="hljs-keyword">goto</span> lab;
<span class="hljs-keyword">else</span>
<span class="hljs-keyword">Exit</span>();
}
printf(<span class="hljs-string">"请输入查找方式: 1、学号查找\n\t\t2、姓名查找:\n"</span>);
printf(<span class="hljs-string">"您的选择是?"</span>); <span class="hljs-comment">//数据查询方式选择</span>
scanf(<span class="hljs-string">"%d"</span>,&choice); <span class="hljs-comment">//用户输入查询方式</span>
Info_Serach(head,choice); <span class="hljs-comment">//数据查询函数调用</span>
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">5</span>: <span class="hljs-comment">//进入【数据添加模块】</span>
printf(<span class="hljs-string">"->学生信息添加\n\n"</span>);
<span class="hljs-keyword">if</span>(head->next==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//判断是否有初始数据</span>
{
printf(<span class="hljs-string">"没有数据输出,是否创建?Y/N:"</span>);
<span class="hljs-comment">//如果不存在,则提示用户是否新建</span>
getchar();
scanf(<span class="hljs-string">"%c"</span>,&ch);
<span class="hljs-keyword">if</span>(ch==<span class="hljs-string">'Y'</span>||ch==<span class="hljs-string">'y'</span>) <span class="hljs-comment">//如果用户同意,则跳转至【数据输入模块】</span>
<span class="hljs-keyword">goto</span> lab;
<span class="hljs-keyword">else</span>
<span class="hljs-keyword">Exit</span>(); <span class="hljs-comment">//否则结束程序</span>
}
<span class="hljs-keyword">else</span>
head=Info_Add(head);<span class="hljs-keyword">break</span>; <span class="hljs-comment">//数据添加函数调用</span>
<span class="hljs-keyword">case</span> <span class="hljs-number">6</span>: <span class="hljs-comment">//进入【数据删除模块】</span>
printf(<span class="hljs-string">"->学生信息删除\n\n"</span>); <span class="hljs-comment">//输出当前位置</span>
Info_Print(head); <span class="hljs-comment">//打印出当前数据链中所有数据供用户选择</span>
<span class="hljs-keyword">if</span>(head->next==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//判断是否有数据删除</span>
printf(<span class="hljs-string">"没有数据需要删除!\n"</span>);
<span class="hljs-keyword">else</span>
head=Info_Del(head); <span class="hljs-comment">//数据删除函数调用</span>
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">7</span>: <span class="hljs-comment">//进入【数据修改模块】</span>
printf(<span class="hljs-string">"->学生信息修改\n\n"</span>); <span class="hljs-comment">//输出当前位置</span>
Info_Print(head); <span class="hljs-comment">//数据输出--屏幕函数调用</span>
<span class="hljs-keyword">if</span>(head->next==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//判断链表是否为空</span>
printf(<span class="hljs-string">"没有数据需要修改!\n"</span>);
<span class="hljs-keyword">else</span>
head=Info_Change(head);<span class="hljs-keyword">break</span>; <span class="hljs-comment">//数据修改函数调用</span>
<span class="hljs-keyword">case</span> <span class="hljs-number">8</span>: <span class="hljs-comment">//进入【数据输出--文件模块】</span>
printf(<span class="hljs-string">"->学生信息保存\n\n"</span>);
<span class="hljs-keyword">if</span>(head->next==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//判断链表是否为空</span>
{
printf(<span class="hljs-string">"没有数据需要保存!\n"</span>);
}
<span class="hljs-keyword">else</span>
Print_file(head); <span class="hljs-comment">//数据输出--文件函数调用</span>
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">9</span>:
<span class="hljs-keyword">Exit</span>(); <span class="hljs-comment">//结束程序调用</span>
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">default</span>:printf(<span class="hljs-string">"您的输入有误!\n"</span>); <span class="hljs-comment">//如果用户输入的选择没有该选项,则提示重新输入选择</span>
system(<span class="hljs-string">"pause"</span>);
system(<span class="hljs-string">"cls"</span>); <span class="hljs-comment">//清除当前屏幕上的所有内容</span>
<span class="hljs-keyword">goto</span> e; <span class="hljs-comment">//跳转至【菜单打印模块】</span>
}
getchar();
printf(<span class="hljs-string">"返回主菜单重新选择y/n?"</span>); <span class="hljs-comment">//程序执行完成后由用户决定是否继续操作</span>
scanf(<span class="hljs-string">"%c"</span>,&ch);
<span class="hljs-keyword">if</span>(ch==<span class="hljs-string">'Y'</span>||ch==<span class="hljs-string">'y'</span>) <span class="hljs-comment">//若用户同意,则跳转至初始位置供用户使用</span>
{
system(<span class="hljs-string">"cls"</span>);
<span class="hljs-keyword">goto</span> e;
}
<span class="hljs-keyword">else</span> <span class="hljs-comment">//否则结束程序</span>
<span class="hljs-keyword">Exit</span>();
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
<span class="hljs-keyword">int</span> Info_Logins() <span class="hljs-comment">//系统登录函数调用 </span>
{
printf(<span class="hljs-string">"\t 欢迎使用学生信息管理系统\n"</span>);
char passWord[<span class="hljs-number">18</span>];
char p[]=<span class="hljs-string">"admin"</span>; <span class="hljs-comment">//初始登录密码设置</span>
char ch;
<span class="hljs-keyword">int</span> i=<span class="hljs-number">0</span>;
<span class="hljs-keyword">int</span> a,b,c,d;
srand((unsigned)time(<span class="hljs-literal">NULL</span>));
a=rand()<span class="hljs-number">0</span>; <span class="hljs-comment">//随机整数生成</span>
b=rand()<span class="hljs-number">0</span>;
c=a+b; <span class="hljs-comment">//取两个整数和</span>
printf(<span class="hljs-string">"\n"</span>);
printf(<span class="hljs-string">"\t\t用户名:Resmic\n"</span>); <span class="hljs-comment">//初始登录用户名设置</span>
printf(<span class="hljs-string">"\n"</span>);
printf(<span class="hljs-string">"\t\t 密码:"</span>);
<span class="hljs-keyword">while</span>((ch=getch())!=<span class="hljs-number">13</span>) <span class="hljs-comment">//接受用户输入的密码,并同时打印出*号,</span>
{
putchar(<span class="hljs-string">'*'</span>); <span class="hljs-comment">//达到隐藏输入密码的效果</span>
passWord[i]=ch; <span class="hljs-comment">//将输入的密码依次保存在密码字符串数组中</span>
i++;
}
passWord[i]=<span class="hljs-string">'\0'</span>;
<span class="hljs-keyword">if</span>(strcmp(p,passWord)==<span class="hljs-number">0</span>) <span class="hljs-comment">//检查用户输入密码是否等于设置密码</span>
{ <span class="hljs-comment">//如果密码正确则继续验证验证码</span>
printf(<span class="hljs-string">"\n\t *************************\n"</span>);
printf(<span class="hljs-string">"\t\t验证码: %d+%d=?\n"</span>,a,b); <span class="hljs-comment">//打印出随机算式</span>
printf(<span class="hljs-string">"\t\t答案为:"</span>);
scanf(<span class="hljs-string">"%d"</span>,&d);
<span class="hljs-keyword">if</span>(c==d) <span class="hljs-comment">//验证登录验证码</span>
<span class="hljs-keyword">return</span> <span class="hljs-number">1</span>; <span class="hljs-comment">//如果密码和验证码同时正确则返回1</span>
<span class="hljs-keyword">else</span>
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; <span class="hljs-comment">//否则返回0</span>
}
<span class="hljs-keyword">else</span>
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; <span class="hljs-comment">//如果密码不正确则返回0 </span>
}
<span class="hljs-keyword">void</span> Menu() <span class="hljs-comment">//菜单打印模块</span>
{
printf(<span class="hljs-string">"\t 欢迎使用学生信息管理系统\n"</span>);
printf(<span class="hljs-string">"\n*******************************************\n"</span>);
printf(<span class="hljs-string">"** \t\t1、学生信息录入\t\t **\n"</span>);
printf(<span class="hljs-string">"** \t\t2、学生信息浏览\t\t **\n"</span>);
printf(<span class="hljs-string">"** \t\t3、学生信息排序\t\t **\n"</span>);
printf(<span class="hljs-string">"** \t\t4、学生信息查找\t\t **\n"</span>);
printf(<span class="hljs-string">"** \t\t5、学生信息添加\t\t **\n"</span>);
printf(<span class="hljs-string">"** \t\t6、学生信息删除\t\t **\n"</span>);
printf(<span class="hljs-string">"** \t\t7、学生信息修改\t\t **\n"</span>);
printf(<span class="hljs-string">"** \t\t8、学生信息保存\t\t **\n"</span>);
printf(<span class="hljs-string">"**\t\t9、退出\t\t\t **\n"</span>);
printf(<span class="hljs-string">"*******************************************\n"</span>);
}
<span class="hljs-keyword">int</span> Input_Choice() <span class="hljs-comment">//数据输入方式选择模块</span>
{
<span class="hljs-keyword">int</span> i;
system(<span class="hljs-string">"cls"</span>);
printf(<span class="hljs-string">"\t 欢迎使用学生信息管理系统\n"</span>);
printf(<span class="hljs-string">"\n请选择数据输入方式:\n\t\t1、键盘录入\n"</span>);
printf(<span class="hljs-string">"\t\t2、文件读取\n"</span>);
printf(<span class="hljs-string">"\t\t0、返回\n"</span>);
printf(<span class="hljs-string">"您的选择是?"</span>);
scanf(<span class="hljs-string">"%d"</span>,&i);
<span class="hljs-keyword">return</span> i;
}
SDate *Info_Add(SDate *head) <span class="hljs-comment">//数据键盘输入及信息添加模块</span>
{
<span class="hljs-keyword">int</span> n=<span class="hljs-number">0</span>,flag=-<span class="hljs-number">1</span>;
SDate *p1,*p2,*p3,*p4;
p1=head;
<span class="hljs-keyword">while</span>(p1->next!=<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//判断是否已有数据存在</span>
{
n++; <span class="hljs-comment">//检测当前链表已存在节点个数</span>
p1=p1->next;
}
p2=(SDate *)malloc(sizeof(SDate));
printf(<span class="hljs-string">"请输入%d个学生的学号(输入0结束):\n"</span>,n+<span class="hljs-number">1</span>);
scanf(<span class="hljs-string">"%d"</span>,&p2->num);
<span class="hljs-keyword">for</span>(p3=head->next;p3!=<span class="hljs-literal">NULL</span>;p3=p3->next) <span class="hljs-comment">//检测数据中是否存在相同学号</span>
{
<span class="hljs-keyword">if</span>(p3->num==p2->num)
flag=<span class="hljs-number">1</span>; <span class="hljs-comment">//若存在,则flag=1;</span>
}
<span class="hljs-keyword">while</span>(flag==<span class="hljs-number">1</span>) <span class="hljs-comment">//循环检查数据中是否存在相同学号 </span>
{
flag=-<span class="hljs-number">1</span>; <span class="hljs-comment">//初始化flag</span>
printf(<span class="hljs-string">"该学号已经存在!请重新输入\n"</span>); <span class="hljs-comment">//若存在则重新输入</span>
printf(<span class="hljs-string">"请重新输入%d个学生的学号(输入0结束):\n"</span>,n+<span class="hljs-number">1</span>);
scanf(<span class="hljs-string">"%d"</span>,&p2->num);
<span class="hljs-keyword">for</span>(p3=head->next;p3!=<span class="hljs-literal">NULL</span>;p3=p3->next) <span class="hljs-comment">//检测数据中是否还是存在相同学号</span>
{
<span class="hljs-keyword">if</span>(p3->num==p2->num)
flag=<span class="hljs-number">1</span>; <span class="hljs-comment">//若存在,则flag=1;</span>
}
}
<span class="hljs-keyword">if</span>(p2->num==<span class="hljs-number">0</span>) <span class="hljs-comment">//如果学号为0,则结束输入,返回头指针</span>
{
p1->next=<span class="hljs-literal">NULL</span>;
<span class="hljs-keyword">return</span>(head);
}
<span class="hljs-keyword">else</span> <span class="hljs-comment">//如果不为0,则进行后续数据输入</span>
{
<span class="hljs-keyword">while</span>(p2->num!=<span class="hljs-number">0</span>) <span class="hljs-comment">//当学号不为0时进行循环数据输入</span>
{
printf(<span class="hljs-string">"请输入该学生姓名:\n"</span>); <span class="hljs-comment">//输入姓名</span>
scanf(<span class="hljs-string">"%s"</span>,p2->name);
<span class="hljs-keyword">while</span>(sizeof(p2->name)><span class="hljs-number">18</span>) <span class="hljs-comment">//判循环断--姓名不能大于18字符</span>
{
printf(<span class="hljs-string">"姓名只能在18字符以内:\n"</span>);
printf(<span class="hljs-string">"请重新输入该学生姓名:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p2->name);
}
printf(<span class="hljs-string">"请输入该学生年龄:\n"</span>); <span class="hljs-comment">//输入年龄</span>
scanf(<span class="hljs-string">"%d"</span>,&p2->age);
<span class="hljs-keyword">while</span>(p2->age<=<span class="hljs-number">0</span>) <span class="hljs-comment">//循环判断--年龄必须大于0</span>
{
printf(<span class="hljs-string">"年龄必须大于0\n"</span>);
printf(<span class="hljs-string">"请重新输入该学生年龄:\n"</span>);
scanf(<span class="hljs-string">"%d"</span>,&p2->age);
}
getchar();
printf(<span class="hljs-string">"请输入该学生性别(男士为B或b,女士为G或g):\n"</span>);
scanf(<span class="hljs-string">"%c"</span>,&p2->sex); <span class="hljs-comment">//输入性别</span>
printf(<span class="hljs-string">"请输入该学生出生年月(格式为xxxx xx):\n"</span>);
scanf(<span class="hljs-string">"%d%d"</span>,&p2->y,&p2->m); <span class="hljs-comment">//输入出生年月</span>
<span class="hljs-keyword">while</span>(p2->y><span class="hljs-number">2014</span>||p2->y<<span class="hljs-number">1</span>||p2->m><span class="hljs-number">12</span>||p2->m<<span class="hljs-number">1</span>)
{ <span class="hljs-comment">//循环判断--年月是否符合实际</span>
printf(<span class="hljs-string">"你的输入有误!\n"</span>);
printf(<span class="hljs-string">"请重新输入该学生出生年月(格式为xxxx xx):\n"</span>);
scanf(<span class="hljs-string">"%d%d"</span>,&p2->y,&p2->m);
}
printf(<span class="hljs-string">"请输入该学生住址:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p2->add); <span class="hljs-comment">//输入地址</span>
<span class="hljs-keyword">while</span>(sizeof(p2->add)><span class="hljs-number">30</span>) <span class="hljs-comment">//循环判断--地址不能超过30个字符</span>
{
printf(<span class="hljs-string">"地址在只能在30个字符以内!\n"</span>);
printf(<span class="hljs-string">"请重新输入该学生住址:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p2->add);
}
printf(<span class="hljs-string">"请输入该学生联系电话:\n"</span>);
scanf(<span class="hljs-string">"%d"</span>,&p2->tel); <span class="hljs-comment">//输入电话号码</span>
printf(<span class="hljs-string">"请输入该学生E-Mail:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p2->mail);
<span class="hljs-keyword">while</span>(sizeof(p2->add)><span class="hljs-number">30</span>) <span class="hljs-comment">//循环判断--邮箱不能超过30个字符</span>
{
printf(<span class="hljs-string">"邮箱在只能在30个字符以内!\n"</span>);
printf(<span class="hljs-string">"请输入该学生E-Mail:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p2->mail);
}
n++;
p1->next=p2; <span class="hljs-comment">//使当前数据地址链接到链表末尾</span>
p1=p2;
p2=(SDate *)malloc(sizeof(SDate)); <span class="hljs-comment">//重新开辟内存空间,准备进行下一次数据输入</span>
printf(<span class="hljs-string">"请输入%d个学生的学号(输入0结束):\n"</span>,n+<span class="hljs-number">1</span>);
scanf(<span class="hljs-string">"%d"</span>,&p2->num);
p4=head->next;
<span class="hljs-keyword">while</span>(p3!=<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//再次检测数据中是否存在相同的学号</span>
{
<span class="hljs-keyword">if</span>(p2->num==p4->num)
flag=<span class="hljs-number">1</span>;
p3=p3->next;
}
<span class="hljs-keyword">while</span>(flag==<span class="hljs-number">1</span>) <span class="hljs-comment">//若存在,则重新输入</span>
{
flag=-<span class="hljs-number">1</span>;
printf(<span class="hljs-string">"该学号已经存在!请重新输入\n"</span>);
printf(<span class="hljs-string">"请重新输入%d个学生的学号(输入0结束):\n"</span>,n+<span class="hljs-number">1</span>);
scanf(<span class="hljs-string">"%d"</span>,&p2->num); <span class="hljs-comment">//重新输入</span>
<span class="hljs-keyword">for</span>(p4=head->next;p4!=<span class="hljs-literal">NULL</span>;p4=p4->next)
{
<span class="hljs-keyword">if</span>(p4->num==p2->num) <span class="hljs-comment">//再次检测</span>
flag=<span class="hljs-number">1</span>;
}
}
}
p1->next=<span class="hljs-literal">NULL</span>;
free(p2); <span class="hljs-comment">//释放其开辟的内存</span>
}
<span class="hljs-keyword">return</span>(head);
}
SDate *Input_file(SDate *head) <span class="hljs-comment">//数据从文件输入模块</span>
{
SDate *p,*p2;
p=head;
FILE *fp;
<span class="hljs-keyword">if</span>((fp=fopen(<span class="hljs-string">"StuInfo.txt"</span>,<span class="hljs-string">"r"</span>))==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//打开同目录下的StuInfo.txt文件</span>
printf(<span class="hljs-string">"文件读取失败!可能的原因是\n\n1、目录下不存在该文件\n2、文件名不是StuInfo\n3、文件类型不是txt\n\n"</span>);
<span class="hljs-keyword">else</span>
{
<span class="hljs-keyword">while</span>(!feof(fp)) <span class="hljs-comment">//判断文件指针是否指向结束</span>
{
p2=(SDate *)malloc(sizeof(SDate)); <span class="hljs-comment">//将数据写入链表</span>
fscanf(fp,<span class="hljs-string">"%d %s %c %d %d %d %d %s %s\n"</span>,&p2->num,p2->name,&p2->sex,&p2->age,&p2->y,&p2->m,&p2->tel,p2->add,p2->mail);
p->next=p2;
p=p2;
}
p->next=<span class="hljs-literal">NULL</span>;
fclose(fp); <span class="hljs-comment">//关闭文件</span>
printf(<span class="hljs-string">"\t\t文件读取成功!\n"</span>);
}
<span class="hljs-keyword">return</span> head; <span class="hljs-comment">//返回头指针</span>
}
<span class="hljs-keyword">void</span> Info_Print(SDate *head) <span class="hljs-comment">//数据输出至屏幕模块</span>
{
SDate *p;
p=head->next;
printf(<span class="hljs-string">"学号 姓名 性别 年龄 出生年月 电话 地址 E-Mail\n"</span>);
<span class="hljs-keyword">while</span>(p!=<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//如果当前不为空,则输出</span>
{
printf(<span class="hljs-string">"%d %s %c %d %d-%d %d %s %s\n"</span>,p ->num,p->name,p->sex,p->age,p->y,p->m,p->tel,p->add,p->mail);
p=p->next; <span class="hljs-comment">//指向下一个节点</span>
}
printf(<span class="hljs-string">"\n"</span>);
}
<span class="hljs-keyword">void</span> Print_file(SDate *head) <span class="hljs-comment">//数据保存至文件模块</span>
{
FILE *fp;
SDate *p;
p=head->next;
<span class="hljs-keyword">if</span>((fp=fopen(<span class="hljs-string">"StuInfo.txt"</span>,<span class="hljs-string">"w+"</span>))==<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//打开同目录下的StuInfo.txt文件</span>
printf(<span class="hljs-string">"文件保存失败!\n"</span>);
<span class="hljs-keyword">else</span>
{
<span class="hljs-keyword">while</span>(p!=<span class="hljs-literal">NULL</span>)
{ <span class="hljs-comment">//将链表中的数据写入到文件</span>
fprintf(fp,<span class="hljs-string">"%d %s %c %d %d %d %d %s %s\n"</span>,p->num,p->name,p->sex,p->age,p->y,p->m,p->tel,p->add,p->mail);
p=p->next; <span class="hljs-comment">//指向下一个节点</span>
}
fclose(fp); <span class="hljs-comment">//关闭文件</span>
printf(<span class="hljs-string">"\n保存成功!\n"</span>);
}
}
SDate *Info_Short(SDate *head) <span class="hljs-comment">//数据排序模块</span>
{
<span class="hljs-keyword">int</span> n=<span class="hljs-number">0</span>,i,j;
SDate *p,*p1,*p2;
<span class="hljs-keyword">for</span>(p=head;p->next!=<span class="hljs-literal">NULL</span>;p=p->next)
{
n++; <span class="hljs-comment">//检测当前链表已存在节点个数</span>
}
<span class="hljs-keyword">for</span>(p=head,p1=p->next,p2=p1->next,i=<span class="hljs-number">0</span>;i
{
<span class="hljs-keyword">for</span>(p=head,p1=p->next,p2=p1->next,j=<span class="hljs-number">0</span>;j
{ <span class="hljs-comment">//利用冒泡排序法进行数据排序</span>
<span class="hljs-keyword">if</span>((p1->num)>(p2->num))
{
p->next=p2;
p1->next=p2->next;
p2->next=p1;
}
p=p->next;
p1=p->next;
p2=p1->next;
}
}
printf(<span class="hljs-string">"排序完成!\n"</span>);
<span class="hljs-keyword">return</span> head; <span class="hljs-comment">//返回头指针</span>
}
SDate *Info_Del(SDate *head) <span class="hljs-comment">//数据删除模块</span>
{
<span class="hljs-keyword">int</span> Num;
SDate *p,*p1;
p1=head;
p=p1->next; <span class="hljs-comment">//将操作指针指向第一个数据存放地址</span>
printf(<span class="hljs-string">"请输入需要删除的学号:"</span>);
scanf(<span class="hljs-string">"%d"</span>,&Num);
<span class="hljs-keyword">while</span>(p!=<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//若当前指针不为空</span>
{
<span class="hljs-keyword">if</span>(p->num==Num)
{
p1->next=p->next;
printf(<span class="hljs-string">"学号为%d的学生信息删除成功!\n"</span>,Num);
}
p1=p1->next;
p=p->next; <span class="hljs-comment">//指向下一个节点</span>
}
<span class="hljs-keyword">return</span> head; <span class="hljs-comment">//返回头指针</span>
}
SDate *Info_Change(SDate *head) <span class="hljs-comment">//数据修改模块</span>
{
SDate *p;
p=head->next; <span class="hljs-comment">//指向数据存放的第一个地址</span>
<span class="hljs-keyword">int</span> Num,flag=-<span class="hljs-number">1</span>;
printf(<span class="hljs-string">"请输入需要修改的学号:\n"</span>);
scanf(<span class="hljs-string">"%d"</span>,&Num);
<span class="hljs-keyword">while</span>(p!=<span class="hljs-literal">NULL</span>) <span class="hljs-comment">//若当前不为空</span>
{
<span class="hljs-keyword">if</span>(p->num==Num)
{
flag=<span class="hljs-number">1</span>;
printf(<span class="hljs-string">"请输入该学生姓名:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p->name);
<span class="hljs-keyword">while</span>(sizeof(p->name)><span class="hljs-number">18</span>) <span class="hljs-comment">//循环判断--修改后的姓名不能超过18个字符</span>
{
printf(<span class="hljs-string">"姓名只能在18字符以内:\n"</span>);
printf(<span class="hljs-string">"请重新输入该学生姓名:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p->name);
}
printf(<span class="hljs-string">"请输入该学生年龄:\n"</span>);
scanf(<span class="hljs-string">"%d"</span>,&p->age);
<span class="hljs-keyword">while</span>(p->age<<span class="hljs-number">1</span>) <span class="hljs-comment">//循环判断--修改后的年龄必须大于0</span>
{
printf(<span class="hljs-string">"年龄必须大于0\n"</span>);
printf(<span class="hljs-string">"请重新输入该学生年龄:\n"</span>);
scanf(<span class="hljs-string">"%d"</span>,&p->age);
}
getchar();
printf(<span class="hljs-string">"请输入该学生性别(男士为B或b,女士为G或g):\n"</span>);
scanf(<span class="hljs-string">"%c"</span>,&p->sex);
printf(<span class="hljs-string">"请输入该学生出生年月(格式为xxxx xx):\n"</span>);
scanf(<span class="hljs-string">"%d%d"</span>,&p->y,&p->m);
<span class="hljs-keyword">while</span>(p->y><span class="hljs-number">2014</span>||p->y<<span class="hljs-number">1</span>||p->m><span class="hljs-number">12</span>||p->m<<span class="hljs-number">1</span>)
{ <span class="hljs-comment">//循环判断--修改后的年月必须符合实际</span>
printf(<span class="hljs-string">"您的输入有误!\n"</span>);
printf(<span class="hljs-string">"请重新输入该学生出生年月(格式为xxxx xx):\n"</span>);
scanf(<span class="hljs-string">"%d%d"</span>,&p->y,&p->m);
}
printf(<span class="hljs-string">"请输入该学生住址:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p->add);
<span class="hljs-keyword">while</span>(sizeof(p->add)><span class="hljs-number">30</span>) <span class="hljs-comment">//循环判断--修改后的地址不能超过30个字符</span>
{
printf(<span class="hljs-string">"地址在只能在30个字符以内!\n"</span>);
printf(<span class="hljs-string">"请重新输入该学生住址:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p->add);
}
printf(<span class="hljs-string">"请输入该学生联系电话:\n"</span>);
scanf(<span class="hljs-string">"%d"</span>,&p->tel);
<span class="hljs-keyword">while</span>(sizeof(p->tel)><span class="hljs-number">11</span>) <span class="hljs-comment">//循环判断--修改后的电话号码不能超过11个字符</span>
{
printf(<span class="hljs-string">"您的输入有误!"</span>);
printf(<span class="hljs-string">"请重新输入该学生联系电话:\n"</span>);
scanf(<span class="hljs-string">"%d"</span>,&p->tel);
}
printf(<span class="hljs-string">"请输入该学生E-Mail:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p->mail);
<span class="hljs-keyword">while</span>(sizeof(p->add)><span class="hljs-number">30</span>) <span class="hljs-comment">//循环判断--修改后的邮箱不能超过30个字符</span>
{
printf(<span class="hljs-string">"邮箱在只能在30个字符以内!\n"</span>);
printf(<span class="hljs-string">"请重新输入该学生E-Mail:\n"</span>);
scanf(<span class="hljs-string">"%s"</span>,p->mail);
}
}
p=p->next;
}
<span class="hljs-keyword">if</span>(flag==-<span class="hljs-number">1</span>)
printf(<span class="hljs-string">"该学号不存在!\n"</span>);
<span class="hljs-keyword">else</span>
printf(<span class="hljs-string">"修改完成!\n"</span>);
<span class="hljs-keyword">return</span> head;
}
<span class="hljs-keyword">void</span> Info_Serach(SDate *head,<span class="hljs-keyword">int</span> choice) <span class="hljs-comment">//数据查找模块</span>
{
<span class="hljs-keyword">int</span> n,flag=-<span class="hljs-number">1</span>;
char name[<span class="hljs-number">20</span>];
SDate *p;
p=head->next;
<span class="hljs-keyword">if</span>(choice==<span class="hljs-number">1</span>)
{
printf(<span class="hljs-string">"请输入学号:"</span>); <span class="hljs-comment">//学号查找</span>
scanf(<span class="hljs-string">"%d"</span>,&n);
<span class="hljs-keyword">while</span>(p!=<span class="hljs-literal">NULL</span>)
{
<span class="hljs-keyword">if</span>(p->num==n)
{
printf(<span class="hljs-string">"%d %s %c %d %d-%d %d %s %s\n"</span>,p ->num,p->name,p->sex,p->age,p->y,p->m,p->tel,p->add,p->mail);
flag=<span class="hljs-number">1</span>;
}
p=p->next;
}
<span class="hljs-keyword">if</span>(flag==-<span class="hljs-number">1</span>)
printf(<span class="hljs-string">"对不起,该数据不存在!\n"</span>);
}
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(choice==<span class="hljs-number">2</span>)
{
printf(<span class="hljs-string">"请输入姓名:"</span>); <span class="hljs-comment">//姓名查找</span>
scanf(<span class="hljs-string">"%s"</span>,name);
<span class="hljs-keyword">while</span>(p!=<span class="hljs-literal">NULL</span>)
{
<span class="hljs-keyword">if</span>(strcmp(p->name,name)==<span class="hljs-number">0</span>)
{
printf(<span class="hljs-string">"%d %s %c %d %d-%d %d %s %s\n"</span>,p ->num,p->name,p->sex,p->age,p->y,p->m,p->tel,p->add,p->mail);
flag=<span class="hljs-number">1</span>;
}
p=p->next;
}
<span class="hljs-keyword">if</span>(flag==-<span class="hljs-number">1</span>)
printf(<span class="hljs-string">"对不起,该数据不存在!\n"</span>);
}
<span class="hljs-keyword">else</span>
{
printf(<span class="hljs-string">"您的选择有误!\n"</span>);
}
}
<span class="hljs-keyword">void</span> <span class="hljs-keyword">Exit</span>() <span class="hljs-comment">//退出模块</span>
{
printf(<span class="hljs-string">"谢谢使用!\n"</span>);
<span class="hljs-keyword">exit</span>(<span class="hljs-number">1</span>);
}