数据结构,请用C语言写代码

基本要求:利用链式结构完成班级学生信息的一般性管理工作。其中,每条记录至少包括学号,姓名,性别,出生年月,手机号,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>);
}