[size=4]#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<math.h>

typedef struct students   /*学生信息数据结构的定义*/
{
   int number[100];
   char name[20];
   char sex[4];
   float score1;
   float score2;
   float score3;
   float ave;
   float sum;
 }T_Student;

typedef struct ListNode  /*定义结构体*/
{
    T_Student tData;
    struct ListNode * ptNext;
}T_ListNode,*T_LinkList;


void InitList(T_LinkList *L) /*初始化链表*/
{
    *L=(T_LinkList)malloc(sizeof(T_ListNode));
    if(NULL == L)
    {

    }
    (*L)->ptNext =NULL;
   
}






void input(T_ListNode  L)  /*输入学生信息*/

   T_ListNode *p;
   printf("---请输入学生信息---\n");
   printf("输入学生学号:\n");
   scanf("%d",p->tData.number);
   printf("输入学生姓名:\n");
   gets(p->tData.name);
   printf("输入学生性别:\n");
   gets(p->tData.sex);
   printf("输入学生成绩1:\n");
   scanf("%f",p->tData.score1);
   printf("输入学生成绩2:\n");
   scanf("%f",p->tData.score2);
   printf("输入学生成绩3:\n");
   scanf("%f",p->tData.score3);
}



void Printlist(T_ListNode head) /*显示学生信息*/
{
   T_ListNode *p;
   *p=head;
   printf("学生信息列表\n");
   printf("学号\n姓名\n性别\n成绩1\n成绩2\n成绩3\n");
   while(p!=NULL)
       {
          printf("%d\n%s\n%s\n%.2f\n%.2f\n%.2f\n",p->tData.number,p->tData.name,p->tData.sex,p->tData.score1,p->tData.score2,p->tData.score3");
              p=p->ptNext;
        }
      
   
   printf("\n按任意键返回主菜单");
   
}



void check(T_Student *head)  /*查询学生信息*/
{  T_Student *temp = head;

    if (NULL==head)
    {
        printf("没有学生信息,请先输入后再查看学生信息\n\n");
    }
    else
    {    
        printf("学生的所有信息如下:\n\n");
        
        printf("\n");;
        while (temp->ptNext!=NULL)
    
            temp = temp->ptNext;
        
        printf("\n\n");
    }
}
/*按学生学号进行查询*/
struct T_Student Numcheck(T_Student *head, char number[])
{
     T_Student *temp = head;

    while (temp->ptNext != NULL)
    {
        if (!strcmp(temp->num, number))
        {
            return temp;
        }
        temp = temp->ptNext;
    }
    return NULL;
}

/*按学生姓名进行查询*/
struct T_Student Namecheck( T_Student *head, char name[])
{
     T_Student *temp = head;

    while (temp->ptNext != NULL)
    {
        if (!strchr(temp->name, name))
        {
            return temp;
        }
        temp = temp->ptNext;
    }
    return NULL;
}

/*按输入信息进行查询学生信息,若找到,返回指向该信息地址的指针,否则返回NULL*/
struct T_Student check( T_Student *head)
{
    char number[12];
    char name[15];
    int select;
    int i = 0; /*记录是否按要求查找到学生信息,找到i=1,否则i=0*/
    struct T_Student *temp = head;

    if (head == NULL)
    {
        printf("没有学生信息,不能进行查询\n\n");
        return NULL;
    }
    else
    {
        /*确保输入的数字是1或2或3*/
        while (1)
        {
            printf("按学号查询请按1\n按姓名查询请按2\n返回上级菜单请按3\n");
            scanf("%d", &select);
            if(select==1 || select==2|| select==3) 
            {
                break;
            }
            printf("输入的数字非法,请输入1或2或3\n\n");
        } /*end of while */

        switch (select)
        {
            case 1: /*按学号进行查询*/
                printf("请输入要查询的学号:");
                scanf("%s", number);
                temp = Numcheck(head, number);
                break;
            case 2: /*按学生姓名进行查询*/
                printf("请输入要查询的学生名字:");
                scanf("%s", stuname);
                temp = Namecheck(head, name);
                break;
            case 3:/*返回上级菜单*/
                return;
            default;
        } 
}



void   update( T_Student *head)  /*更新学生信息*/
{
    T_Student *temp = NULL;
    int isupdate; /*判断学生的信息受否已经修改*/
    printf("请先用学号或姓名进行查询要修改的学生信息,然后进行修改\n");
    temp = check(head); /*按学号先对要修改的学生信息进行查找*/

    if (temp != NULL)
    {    
        isupdate = InputStuInfo(head, temp);
        /*若学生的信息修改成功,显示出*/
        if (isupdate)
        {
            printf("学生信息已修改,修改后的信息为:\n");
            PrintTitle();
            printf("\n");
            PrintStuInfo(temp);
            printf("\n\n");
        }
    }
    else
    {
        printf("所以不能进行修改\n\n");
    }
}






T_ListNode Creatlist(T_ListNode head) /*添加学生信息*/
{
         int n;
         T_ListNode p;
         p=(T_ListNode)malloc(sizeof(Stu));

   do 
   {
     char ch;
 
        printf("\n\t\t请输入新插入学生信息\n");
           printf("\n输入学生学号:");
           scanf("%d",&p->no);
           getchar();
           printf("\n输入学生姓名:");
           gets(p->name);

           printf("\n输入学生性别:");
           gets(p->sex);

           printf("\n输入学生成绩1:");
           scanf("%f",&p->score1);

           printf("\n输入学生成绩2:");
           scanf("%f",&p->score2);

           printf("\n输入学生成绩3:");
           scanf("%f",&p->score3);
           p->point=head->point;
           head->point=p;
           printf("\n\n");
           
           
           printf("是否继续输入?(Y/N)");
     
           ch=getch();
           system("cls");
   }
  while(ch!='n'&&ch!='N');
}



T_ListNode Delete(T_ListNode head) /*删除学生信息*/
{
     T_ListNode Delete(T_ListNode head)
     {
       int no;
      T_ListNode p,q;
       q=head;
        p=head->point;
       printf("请输入你想删除学生的学号:");
        scanf("%d",&no);
          while(p!=NULL)
          {
            if(p->no==no)
               {
                printf("你删除学生的姓名是:%s\n",p->name);
                printf("他(她)的成绩是:%f\n",p->score);
                q->point=p->point;
                free(p);
                break;
               }
                 p=p->point;
                 q=q->point;
           }
        return head;
}




void  count()  /*计算学生成绩*/
{
    struct T_Student *temp = head; 


/*计算总成绩*/
struct T_Student  sumcount( T_Student *head, char number[] )
{
       T_Student *temp = head;
      if (!strcmp(temp->num, number))
      { sum=score1+score2+score3;

       }
}



/*计算平均成绩*/
struct T_Student  avecount(T_Student *head, char number[])
{
    T_Student *temp =head;
     if (!strcmp(temp->num, number))
  
       {ave=(score1+score2+score3)/3;
        }
}



/*显示总成绩*/
struct T_Student display(T_Student *head, char number[])
{
        T_Student *temp =head;
     if (!strcmp(temp->num, number))
       {printf("总分为:sum);    
       }
}




/*显示平均成绩*/
struct T_Student show(T_Student *head, char number[])
{
        T_Student *temp =head;
     if (!strcmp(temp->num, number))
       {printf("平均分为:ave");    
       }
}

/*按输入的信息进行计算学生成绩*/
{  
   printf("计算总成绩请按1\n计算平均成绩请按2\n显示总成绩请按3\n显示平均成绩请按4\n返回上级  

          菜单请按5");
    scanf("%d",&select);
    if(select==1||select==2||select==3||select==4||select==5)
   {
        break;
    }
    printf("输入的数字非法,请输入1或2或3或4或5\n\n");

    switch(select)
    {
           case 1: /*计算总成绩*/
                   printf("请输入要计算总成绩的学号:");
                   scanf("%s",&number);
                   temp =sum(head,number);
                   
                   break; 
          case 2:/*计算平均成绩*/
                   printf("请输入要计算平均成绩的学号:");
                   scanf("%s",&number);
                   temp =ave(head,number);
                   break;
          case 3:/*显示总成绩*/
                  printf("请输入要显示总成绩的学号:");
                   scanf("%s",&number);
                   temp =display(head,number);
                   break;
           case 4:/*显示平均成绩*/
                  printf("请输入要显示平均成绩的学号:");
                   scanf("%s",&number);
                   temp =show(head,number);
                   break;  
           case 5:/*返回上级菜单*/
                    return;
            default;
     }
         

}



void display()      /*显示名次*/

   printf("请输入你所要显示名次的学号");

  int sum[100],num[100],i,j,t,t2;
  printf("/t num /t sum\n");
  for(i=1;i<=100,i++)
  scanf("%d%d",&num[i],&sum[i]);
  /*输入学号,分数*/
   for(i=1;i<=100,i++)
   for(j=1;j<=100,j++)
  if(sum[i]<sum[j])
   {t=sum[i];
    sum[i]=sum[j];
    sum[j]=t;
    t2=num[i];
    num[i]=num[j];
    num[j]=t2;
   }
  printf("m num sum\n);
  for(i=0;i<=100;i++)
  printf("%2d%5d%5d",i,num[i],sum[i];);
}



 





void Instruction()  /*主界面*/
{
   printf("-------------学生成绩管理--------------\n");
   printf("---------------主菜单----------------------\n");
   printf("--------------请选择操作--------------------\n");
   printf("------------初始化链表请按1-------------------\n"); 
   printf("------------输入学生信息请按2-----------------\n");
   printf("------------显示学生信息请按3-----------------\n");
   printf("------------查询学生信息请按4-----------------\n");
   printf("------------更新学生信息请按5-----------------\n");
   printf("------------添加学生信息请按6-----------------\n");
   printf("------------删除学生信息请按7-----------------\n");
   printf("------------计算学生成绩请按8-----------------\n");
   printf("------------显示学生名次请按9-----------------\n");
   printf("------------返回请按0-------------------------\n");
   printf("----------------------------------------------\n");
   

void main() 
{
    int select; /*根据select的值判断将要进行的操作*/ 
    struct students *head = NULL; /*头指针*/

    head = InputMem(head); /*把学生信息读入内存*/
    while (1)
    {
        Instruction();
        printf("请输入要实现的操作:");
        scanf("%d", &select);
        printf("\n");
        switch (select)
                  {
                     case 1:  Initlist();  /*初始化链表*/
                   break;
                     case 2:  input();     /*输入学生信息*/
                   break;
                     case 3:  Printlist();      /*显示学生信息*/
                   break;
                     case 4:  check();     /*查询学生信息*/ 
                   break;
                     case 5:  update();     /*更新学生信息*/
                   break;
                     case 6:  Creatlist();     /*添加学生信息*/
                   break;
                     case 7:  Delete();      /*删除学生信息*/
                   break;
                     case 8:  count();       /*计算学生成绩*/
                   break;
                     case 9:  display();     /*显示学生名次*/
                   break;
                     case 0:  Instruction();  /*返回主菜单*/
                   default;              /*除了0-9,其他输入不起作用*/ 
                  }
       }
}[/size]