c链表 学生成绩管理系统

这是一个使用C语言编写的学生成绩管理系统,通过单链表实现,具备插入、删除、修改、成绩排序等功能。代码包括插入学生、成绩排序、平均成绩排序等函数,采用直接插入排序方式简化代码理解。

              闲来无聊写了一个学生成绩管理系统,为了巩固下我结构体写的,是用链表实现的。可以进行删除,插入,修改,成绩排序。(链表是不循环单链表)

         代码注释,呵呵 本人比较懒 也知道作为一名合格的程序员注释是必须有的 我把函数做了 注释大家不必研究总的,只需要看懂函数实现的功能.

         对了,对于排序的问题本人没有用什么冒泡,插入排序,因为这种排序需要四个指针,我觉得自己会把自己弄晕。 所以,自己在排序的时候是把链表重建了,重建链表和冒泡啊 插入排序比起来更加简单容易理解。 关于其他的排序暂时没有去深究  

        呵呵。好啦下面贴代码,代码中问题多多 只要我一写程序bug肯定少不了。希望细心的你可以指出其中的不足以便于大家学习促进。



下面是程序里面有的函数:

void insert_data(struct student **phead , struct student *p);    //插入函数,并把学生按学号插入到适当位置

void grade_sort(struct student **phead , struct student *p, int n);  //成绩排序函数

void sortaver(struct student **phead,struct student *p);     //平均成绩排序函数      

void insertstudents(student **phead);   //插入学生函数,并调用插入函数

void caculate_sumorave(struct student *head);  //计算平均,总分函数

void showstudents(student *head);   //打印学生成绩函数

void delect_student(struct student **head);  //删除函数

void creat_list(struct student **phead);   //创建函数

void update(student *head);   //修改函数

void free_list(struct student *head)  //释放内存函数

struct student *arrange( student *phead);  //成绩排序函数



源代码:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define debug 0  
#define stdflush() while(getchar() != '\n')  
#define LEN  sizeof(student) 


typedef struct student
{
long num;
char name[20];
char sex[2];
int socre1;
int socre2;
int socre3;
double aver;
int addtion;
struct student *next;
}student;


void insert_data(struct student **phead , struct student *p);    


void insertstudents(student **phead)
{
    struct student *p = NULL/*, *r = NULL,*/;

p = (student *)malloc(sizeof(student));


printf("\n\n");

if(p != NULL)
{

printf("请输入学生学号:");
scanf("%ld", &p->num);
stdflush();

while(p->num)
{
printf("请输入姓名:");
scanf("%s", p->name);
stdflush();
    
printf("请输入性别:");
scanf("%s",p->sex); 


printf("请输入数学成绩:");
scanf("%d", &p->socre1);
stdflush();


printf("请输入英语成绩:");
scanf("%d", &p->socre2);
stdflush();


printf("请输入C语言:");
scanf("%d", &p->socre3);
stdflush();

insert_data(&(*phead),p);


p = (student *)malloc(sizeof(student));


printf("请输入学生学号:");
scanf("%ld", &p->num);
stdflush();
}
}


else exit(0);


free(p);


    printf("\n插入成功!\n\n");


}


void showstudents(student *head)
  {
  
    student *p;
    p=head;
    printf("学号:\t姓名:\t性别:\t数学:\t英语:\tC语言:\t平均分:\t总分:\t\n");
while(p!=NULL)
{
        
printf("%-8ld%-8s%-8s%-8d%-8d%-8d%-8.1f%-8.1d\n",p->num ,p->name,p->sex,p->socre1,p->socre2,p->socre3,p->aver,p->addtion);


p=p->next;                        
}
printf("\n\n");
  }
     
    
void update(student *head)
{
int flag=1;
long number;
student *p;
printf("\n\n");
printf("请输入要修改的学号:");
scanf("%ld",&number);
p=head;
while(p!=NULL)
{
 if(p->num==number)

printf("学号:\t姓名:\t性别:\t数学:\t英语:\tC语言:\t平均分:\t总分:\t\n");
printf("%-8ld%-8s%-8s%-8d%-8d%-8d%-8.1f%-8.1d\n",p->num ,p->name,p->sex,p->socre1,p->socre2,p->socre3,p->aver,p->addtion);
printf("请输入姓名:");
scanf("%s",p->name);
stdflush();
printf("请输入性别:");
scanf("%s",p->sex);
stdflush();
printf("请输入数学成绩:");
scanf("%d",&p->socre1);
stdflush();
printf("请输入英语成绩:");
scanf("%d",&p->socre2);
stdflush();
printf("请输入C语言成绩:");
scanf("%d",&p->socre3);
stdflush();
flag=0;
break;
}
else
p=p->next;
}

if(flag) printf("没有要找到要修改的学生信息\n!");
else printf("修改成功\n!");
printf("\n\n");
}


void insert_data(struct student **phead , struct student *p)
{
struct student *r = NULL, *q = *phead;


if(*phead == NULL)
{
*phead = p;
p->next = NULL;


return;
}


else if((*phead)->num >= p->num)
{
p->next = *phead;

*phead = p;


return;
}


else while(q)
{

if(p->num > q->num)
{
r = q;
q = q->next;
}


else break;


}


r->next = p;
p->next = q;
}


void grade_sort(struct student **phead , struct student *p, int n)
{
struct student *r = NULL, *q = *phead;

switch(n)
{
case 1:
if(*phead == NULL)
{
*phead = p;
p->next = NULL;


return;
}


else if((*phead)->socre1 >= p->socre1)
{
p->next = *phead;

*phead = p;


return;
}


else while(q)
{

if(p->socre1 > q->socre1)
{
r = q;
q = q->next;
}


else break;


}


r->next = p;
p->next = q;  break;


case 2:
if(*phead == NULL)
{
*phead = p;
p->next = NULL;


return;
}


else if((*phead)->socre2 >= p->socre2)
{
p->next = *phead;

*phead = p;


return;
}


else while(q)
{

if(p->socre2 > q->socre2)
{
r = q;
q= q->next;
}


else break;


}


r->next = p;
p->next = q;  break;


case 3:
if(*phead == NULL)
{
*phead = p;
p->next = NULL;


return;
}

else if((*phead)->socre3 >= p->socre3)
{
p->next = *phead;

*phead = p;


return;
}


else while(q)
{

if(p->socre3 > q->socre3)
{
r = q;
q = q->next;
}


else break;


}


r->next = p;
p->next = q;  break;


case 5:
if(*phead == NULL)
{
*phead = p;
p->next = NULL;


return;
}


else if((*phead)->addtion >= p->addtion)
{
p->next = *phead;

*phead = p;


return;
}


else while(q)
{

if(p->addtion > q->addtion)
{
r = q;
q = q->next;
}


else break;


}


r->next = p;
p->next = q;  break;




}



}


void sortaver(struct student **phead,struct student *p)
{

struct student *r = NULL, *q = *phead;


if(*phead == NULL)
{
*phead = p;
p->next = NULL;


return;
}


else if((*phead)->aver >= p->aver)
{
p->next = *phead;

*phead = p;


return;
}


else while(q)
{

if(p->aver > q->aver)
{
r = q;
q = q->next;
}


else break;


}


r->next = p;
p->next = q;
}


void caculate_sumorave(struct student *head)
{
struct student *p = head;

while(p)
{
p->aver = (p->socre1 + p->socre2 + p->socre3)/(3.0);
p->addtion = p->socre1 + p->socre2 + p->socre3;
p = p->next;
}
}
void creat_list(struct student **phead)
{
struct student *p = NULL/*, *r = NULL, *head = NULL*/;

p = (student *)malloc(sizeof(student));

printf("\n\n");


if(p != NULL)
{

printf("请输入学生学号:");
scanf("%ld", &p->num);
stdflush();

while(p->num)
{
printf("请输入姓名:");
scanf("%s", p->name);
stdflush();
    
printf("请输入性别:");
scanf("%s",p->sex); 


printf("请输入数学成绩:");
scanf("%d", &p->socre1);
stdflush();


printf("请输入英语成绩:");
scanf("%d", &p->socre2);
stdflush();


printf("请输入C语言:");
scanf("%d", &p->socre3);
stdflush();

insert_data(&(*phead),p);


p = (student *)malloc(sizeof(student));


printf("请输入学生学号:");
scanf("%ld", &p->num);
stdflush();
}
}


else exit(0);


free(p);
printf("\n\n");
//r->next = NULL;


}


void delect_student(struct student **head)
{
struct student *r = NULL, *q = *head;
int num = 0;
printf("\n\n");
printf("请输入删除学生的学号:");
scanf("%d",&num);

if((*head)->num == num)
{
*head = q->next;
free(q);
return;
}

while(q)
{
if(q->num != num)
{
r = q;
q = q->next;
}
else 
{
r->next = q->next;
free(q);
break;
}
}


if(q == NULL) printf("没有此学生\n"); 
else printf("删除学生成功\n");
printf("\n\n");
}


void free_list(struct student *head)
{
struct student *r = NULL, *q = NULL;

int n = 0;  //引入n 是为了判断释放了多少次内存


if(head == NULL)
return;

r = head, q = head->next;


while(q)
{
n++;
free(r);


r = q;
q = q->next;
}


free(r);
n++;


#if debug


printf("n = %d\n",n);


#endif


}


struct student *arrange( student *phead)
{
   struct student *p = NULL, *r = phead, *head = NULL;
   int n = 0;

   if(r == NULL)
  return NULL;
   p = phead->next;


   printf("\n   /*--学生成绩排序--*/\n");
   printf("\n   1------数学成绩排序\n");
   printf("   2------英语成绩排序\n");
   printf("   3------C语言成绩排序\n");
   printf("   4------平均分排序\n");
   printf("   5------总 分 排 序\n");
   
   
   printf("\n   请输入对应数字:");
   scanf("%d",&n);
   getchar();
   
   switch(n)
      { 
         case 1:while(p)
{
grade_sort(&head,r,1);
r = p;
p = p->next;
}
grade_sort(&head,r,1);
system("cls");
showstudents(head);break;
         case 2:while(p)
{
grade_sort(&head,r,2);
r = p;
p = p->next;
}
grade_sort(&head,r,1);
system("cls");
showstudents(head);break;
         case 3:while(p)
{
grade_sort(&head,r,3);
r = p;
p = p->next;
}
grade_sort(&head,r,1);
system("cls");
showstudents(head);break;
         case 4:while(p)
{
sortaver(&head,r);
r = p;
p = p->next;
}
sortaver(&head,r);
system("cls");
showstudents(head);break;
         case 5:while(p)
{
grade_sort(&head,r,5);
r = p;
p = p->next;
}
grade_sort(&head,r,5);
system("cls");
showstudents(head);break;
         
default:break;
         
      }
   printf("\n");


   return head;



int main(void)  //主函数
{
student *head = NULL;
    int n = -1;
    while(1)
      {
  printf("1------创建学生信息\n");
       printf("2------插入学生信息\n");
  printf("3------删除学生信息\n");
  printf("4------显示学生信息\n");
  printf("5------修改学生信息\n");
       printf("6------学生成绩排序\n"); 
       
      printf("请选择功能 (输入'0'结束):");
  scanf("%d",&n);
       
  switch(n)
            {
              case 0:free_list(head);return 0;break;    
              case 1:creat_list(&head);caculate_sumorave(head);break;
 case 2:insertstudents(&head);caculate_sumorave(head);break;
 case 3:delect_student(&head);break;
 case 4:system("cls");showstudents(head);break;
 case 5:update(head);caculate_sumorave(head);break;  
 case 6:system("cls");head = arrange(head);break;
              default:break;
            }


     }   




return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值