C语言单链表实现学生管理系统

记录大一粗略学习C语言后以链表做一个简单的学生管理系统,数据以Excel转为txt文本格式的文件进行输入。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>

struct student     
{	
	char name[25];	//姓名 
	int stunum;		//学号 
	double score1;	//平时成绩 
	double score2;	//作业成绩 
	double score3;	//考试成绩 
	double sumscore;	//总成绩 
	struct student * next;
};

int main()
{
	void Menu();
	struct student * entrysystem(void);
	void print(struct student * head);
	struct student * searchsystem(struct student* head); 
	struct student *DeleteStudent(struct student* head);
	struct student* Listsort(struct student* head);
	struct student * head;
	while(1)
	{
		Menu();   //显示菜单

		char a = getch();   //按照菜单输入数字序号
		switch (a)
		{
		case '1':      //成绩信息录入
			head = entrysystem();
			break;
		case '2':      //成绩信息显示
			print(head);
			break;
		case '3':      //查询功能
			searchsystem(head);
			break;
		case '4':      //成绩信息删除
			DeleteStudent(head);
			break;
		case '5':      //排序功能
			head = Listsort(head);
			break;
		case '0':      //退出
			return 0;
			break;
		default:
			printf("输入有误\n");
			system("pause");
			system("cls");
			break;

		}
	}
	return 0;
}

void Menu()
{

	printf("=============================================\n");
	printf("*            请按序号选择功能               *\n");
	printf("*        1、成绩信息录入功能                *\n");
	printf("*        2、成绩信息显示浏览功能            *\n");
	printf("*        3、查询功能                        *\n");
	printf("*        4、成绩信息删除功能                *\n");
	printf("*        5、排序功能                        *\n");
	printf("*        0、退出                            *\n");
	printf("=============================================\n");
	
}


struct student * entrysystem(void)    //功能一、信息录入
{
	struct student *head;	//定义“头指针” 
	struct student *p,*p1;
	p = p1 = (struct student *)malloc(sizeof(struct student));	//在内存动态存储区里分配struct student*类型,
																//大小为一个结构体的字节长度的连续空间 
	FILE *fp;	
	char filename[50];		//定义字符串数组用来保存文件名称 
	
	printf("请输入文件名称\n");
	gets(filename); 
	fp = fopen(filename,"r");		//以只读模式打开文本文件 
	if((fp =fopen(filename,"r"))==NULL)		//判断文件是否存在并做出选择 
	{
		printf("can't open\n");
		getchar();
		exit(0);
	}
	fscanf(fp,"%s	%d	%lf	%lf	%lf",p->name,&p->stunum,&p->score1,&p->score2,&p->score3); //写入文件的数据 
	p->sumscore = p->score1 + p->score2 + p->score3;
	
	head = NULL;	//开始建立动态链表 

	while(p->name[0] != '0')
	{
		
	
		if(head == NULL)	//判断链表是否为空 
		{
			head = p;
		}
		else
		{
			p1 -> next = p;
		}
		p1 = p;
		p = (struct student*)malloc(sizeof(struct student));	//为下一结点开辟空间 
		fscanf(fp,"%s	%d	%lf	%lf	%lf",p->name,&p->stunum,&p->score1,&p->score2,&p->score3);	//写入数据 
		p->sumscore = p->score1 + p->score2 + p->score3;
		
	}
	fclose(fp) ;
	p1 -> next = NULL;	//链表结束,令最后的结点不再接入链表中 
	printf("信息已录入\n"); 
	system("pause");	//暂停 
	system("cls");	//清屏 
	return(head);

}

void print(struct student * head)		//功能二、成绩显示 
{struct student * p;
	double sum;
    printf("\n姓名\t学号\t\t平时成绩\t作业成绩\t考试成绩\n");
    p=head;
    if(head!=NULL)
    do
    {
		printf("%s\t%d\t%0.1lf\t\t%0.1lf\t\t%0.1lf\n",p->name,p->stunum,p->score1,p->score2,p->score3);
        p=p->next;
    }while(p!=NULL);
    system("pause");
	system("cls");
    
}

struct student * searchsystem(struct student* head)		//功能三、姓名查找 
{
	char Searname[25];
	printf("请输入学生姓名\n");
	scanf("%s",Searname);
    struct student* pMove = head;
    if (pMove == NULL)
        return NULL ;
    while ( strcmp(pMove->name,Searname)!=0 ) //字符串比较函数 
    {
     pMove = pMove->next;
    }
    printf("\n姓名\t学号\t\t平时成绩\t作业成绩\t考试成绩\n");
	printf("%s\t%d\t%0.1lf\t\t%0.1lf\t\t%0.1lf\n",pMove->name,pMove->stunum,pMove->score1,pMove->score2,pMove->score3);
	system("pause");
	system("cls");
}


//8.删除学生信息
 struct student *DeleteStudent(struct student* head) 
{
	
	struct student * p,*pbefore;
	int searchnum;
	printf("请输入要删除学生信息的学号:\n");//先把文件中的数据读取到链表
	scanf("%d",&searchnum);
    p = head;
    while(p!=NULL)
    {
    	if(searchnum==p->stunum)
    	{
    		if(p==head)
    		{
    			head = p ->next;
			}
			else if(p->next==NULL)
			{
				p = pbefore;
				p -> next = NULL;
			}
			else
			{
				pbefore -> next = p->next;
			}
			printf("删除成功\n");
		}
		pbefore = p;
		p = p -> next;
	}
	system("pause");
	system("cls");


}
/*按总成绩排序*/
struct student* Listsort(struct student* head) 
{  
	void print(struct student * head);
    struct student *pfirst;       
    struct student *ptail;        
    struct student *pminBefore;    
    struct student *pmin;          
    struct student *p;             

    pfirst = NULL;  
    while (head != NULL)          
    {  
     
        for (p = head, pmin = head; p->next != NULL; p = p->next)   
        {  
            if (p->next->sumscore < pmin->sumscore)   
            {  
                pminBefore = p;            
                pmin       = p->next;      
            }  
        }  

     
        if (pfirst == NULL)      
        {  
            pfirst = pmin;       
            ptail  = pmin;        
        }  
        else                      
        {  
            ptail->next = pmin;   
            ptail = pmin;        
        }  

       
        if (pmin == head)          
        {  
            head = head->next;    
        }  
        else   
        {  
            pminBefore->next = pmin->next;  
        }  
    }  

    if (pfirst != NULL)       
    {  
        ptail->next = head;   
    }  
    head = pfirst;
	print(head); 
	system("pause");
	system("cls");
	return head; 
	
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值