精华内容
下载资源
问答
  • 自己花了点时间琢磨了一个简易版的链表,里面很多地方还是比较复杂的,希望大佬能指导修改一下,同时也供初学数据结构的码友参考学习
  • C语言链表学生成绩管理系统代码,具体内容可以查看博客说明:https://blog.csdn.net/qq_21480607/article/details/90722185
  • c语言链表结构,实现一个学生管理系统,并将信息保存到本地文件。
  • 主要为大家详细介绍了C语言实现学生信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 这个是利用C语言实现学生管理系统,主要是应用了链表,结构体知识,经过调试并作为课程设计作业,如果您正在学习这部分内容,或许对你有用。
  • 学生信息管理系统,压缩包有源码,程序,报告。声明:本人只是用来学习。
  • C语言不用链表完成学生管理系统(完整代码)--附源码
  • 学生成绩管理系统C语言实现报告,链表实现,内含流程图,代码,一切以报告形式完成。
  • 读取和保存函数是实现功能的重要函数,在每次修改前需要调用读取函数拉起链表,修改后需要调用保存函数,存入文件 0.0读取学生信息 void ReadStudent(){ FILE * fp; char k; if ((fp = fopen("D:\\demo.txt", "r...

    读取和保存函数是实现功能的重要函数,在每次修改前需要调用读取函数拉起链表,修改后需要调用保存函数,存入文件

    0.0读取学生信息

    void ReadStudent(){
    	FILE * fp;
    	char k;
    	if ((fp = fopen("D:\\demo.txt", "r")) == NULL) {	//以只读方式打开文件
    		printf("无学生信息");
    		exit(1);
    	}
    	//从文件读取信息 
    	while (!feof(fp)){
    			Node* p = (Node*)malloc(sizeof(Node));		//初始化一个结点p
    			fscanf(fp,"%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, &p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    			p->next = Head->next;	//头插p结点
    			Head->next = p;
    	}
    }
    
    

    0.1保存学生信息

    void SaveStudent() { 
        FILE *fp;
        fp=fopen("D:\\demo.txt","w");		//以只写方式打开文件
        if( fp== NULL ){
        printf("打开文件失败\n");
        exit(1);  //退出程序
        }
    	Node* p = Head->next;
    	while (p != NULL) { 				//依次写入文件
    		fprintf(fp, "%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    		p = p->next;
    	}
    	fclose(fp);
    }
    
    

    下面实现增加、查找、修改、删除功能

    1.录入学生信息

    void InputStudent() {
    	int x;
    	printf("您想要录入的学生人数:");
    	scanf("%d", &x);
    	int j = 1;
    
    	while (x) {
    		Node* p = (Node*)malloc(sizeof(Node));
    
    		printf("录入第%d个学生信息\n", j++);
    		printf("请输入学生的学号:");
    		scanf("%s", p->stu.stuNum);
    
    		Node* k = Head->next;
    		while (k != NULL) {
    			while (strcmp(p->stu.stuNum,k->stu.stuNum)==0) {
    				printf("该学号已存在,请重新输入!\n");
    				printf("请输入学生的学号:");
    				scanf("%s", p->stu.stuNum);
    			}
    			k = k->next;
    		}
    
    
    		printf("请输入学生的姓名:");
    		scanf("%s", p->stu.stuName);
    
    		printf("请输入学生的性别:");
    		scanf("%s", p->stu.stuSex);
    
    		printf("请输入学生的年龄:");
    		scanf("%d", &p->stu.stuAge);
    
    		printf("请输入学生的班级:");
    		scanf("%s", p->stu.stuClass);
    
    		printf("请输入学生的成绩:");
    		scanf("%s", p->stu.stuScore);
    
    		p->next = Head->next;
    		Head->next = p;
    		x--;
    	}
    
    }
    

    2.查找学生信息

    void SearchStudent(){
    	int n;
    	char s[20];
    	printf("请选择查找方式\n");
    	printf("1.根据学号查找\n");
    	printf("2.根据姓名查找\n");
    
    	scanf("%d",&n);
    	
    	switch (n){
    	case 1:{
    		ReadStudent();//从文件将链表读入,Head为头结点
    		int flag=0;
    		Node* p=Head->next;
    		printf("请输入想查找的学号:");
    		scanf("%s",s);
    		while(p!=NULL){
    			if(strcmp(p->stu.stuNum,s)==0){					//字符串匹配
    				printf("学号\t姓名\t性别\t年龄\t班级\t成绩\n");
    				printf("%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    				flag=1;
    				break;
    			}
    			p=p->next;
    		}
    		if(flag==0){
    			printf("没有符合条件的学生\n");
    		}
    	}
    		break;
    	
    	case 2:	{
    		ReadStudent();
    		int flag=0;
    		Node* p=Head->next;
    		printf("请输入想查找的姓名:");
    		scanf("%s",s);
    		while(p){
    			if(strcmp(p->stu.stuName,s)==0){
    				printf("学号\t姓名\t性别\t年龄\t班级\t成绩\n");
    				printf("%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    				flag=1;
    				break;
    			}
    			p=p->next;
    		}
    		if(flag==0){
    			printf("没有符合条件的学生");
    		}
    	}
    		break;
    	}
    }
    

    3.修改学生信息

    void ModifyStudent(){
    	printf("请输入你想修改学生的姓名\n");
    	char s[20];
    	char num[20];
    	char name[20];
    	char sex[20];
    	int age;
    	char classs[20];
    	char score[20];
    	Head->next=NULL;//重要,如果要保存链表,每次读取链表前都要将头指针指向空,不然数据会重复
    	ReadStudent();//读入链表
    	int flag=0;
    	Node* p=Head->next;
    	scanf("%s",s);
    	while(p!=NULL){
    		if(strcmp(p->stu.stuName,s)==0){
    			flag=1;
    			break;
    		}
    		p=p->next;
    	}
    	if(flag==0){
    		printf("没有找到该学生");
    	}else{
    			
    		printf("请输入想修改的内容:\n");
    		printf("1.学生学号\n");
    		printf("2.学生姓名\n");
    		printf("3.学生性别\n");
    		printf("4.学生年龄\n");
    		printf("5.学生班级\n");
    		printf("6.学生成绩\n");
    			
    		int n;
    		scanf("%d",&n);
    		switch(n){
    			case 1: 
    				printf("将学号修改为:");
    				scanf("%s",num);
    				strrpl(p->stu.stuNum,num);  //strrpl为字符串替换函数,见末尾
    				break;
    
    			case 2:
    				printf("将姓名修改为:");
    				scanf("%s",name);
    				strrpl(p->stu.stuName,name);
    				break;
    
    			case 3:
    				printf("将性别修改为:");
    				scanf("%s",sex);
    				strrpl(p->stu.stuSex,sex);
    				break;
    
    			case 4:
    				printf("将年龄修改为:");
    				scanf("%d",&age);	
    				p->stu.stuAge=age;
    				break;
    
    			case 5:
    				printf("将班级修改为:");
    				scanf("%s",classs);
    				strrpl(p->stu.stuClass,classs);
    				break;
    
    			case 6:
    				printf("将成绩修改为:");
    				scanf("%s",score);
    				strrpl(p->stu.stuScore,score);
    				break;
    			}
    		}	
    }
    

    修改的时候需要用到字符替换函数

    //字符替换 s1替换为s2
    void strrpl(char q1[20],char q2[20]){
    	int i=0,j=0;
    	while(q1[i]!='\0'){
    		q1[i++]='\0';
    	}
    	i=0;
    	while(q2[j]!='\0'){
    		q1[i++]=q2[j++];
    	}
    
    }
    

    4.删除学生信息

    void DeleStudent(){ 
    	Head->next=NULL;//重要,如果要保存链表,每次读取链表前都要将头指针指向空,不然数据会重复
    	ReadStudent();
    	char name[20];
    	Node*p=Head->next;
    	Node*q=Head;
    	printf("要删除学生姓名\n");
    	scanf("%s",name);
    	while(p!=NULL){
    		if(strcmp(p->stu.stuName,name)==0){
    			q->next=p->next;
    			free(p);
    		}
    		q=q->next;
    		p=p->next;
    	}
    }
    
    

    最后实现统计和查看功能

    5.统计学生人数

    void NumStudent(){
    	FILE* fp;
    	char w;
    	int num=0;
    	if ((fp = fopen("D:\\demo.txt", "r")) == NULL) {
    		printf("无学生信息");
    	}else{
    		fp = fopen("D:\\demo.txt", "r");
    		while ((w=fgetc(fp))!=EOF){
        		if(w=='\n'){		//根据换行数统计学生人数
    				num++;
    			}
    		}
    		printf("共有学生%d人\n",num);
    	}
    	
    }
    

    6.查看录入学生信息

    void PrintStudent() {
    	Head->next=NULL;
    	ReadStudent();
    	Node* p=Head->next;
    	while (p){
    		printf("%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    		p=p->next;
    	}
    }
    
    

    全部代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     #include<windows.h>
    
    typedef struct _Student {     //学生结点数据域结构体
    	char  stuNum[20];	    //学号
    	char stuName[20];   //姓名
    	char stuSex[20];	   //性别
    	int  stuAge;		//年龄
    	char stuClass[20];  //班级
    	char stuScore[20];	    //分数
    }Student;
    
    typedef struct _Node {			//学生结点
    	Student stu;		//学生
    	struct _Node* next;//指针域
    }Node;
    
    void Welcome();//欢迎界面
    void ReadStudent();//读取学生信息
    void SaveStudent();//保存学生信息
    void InputStudent();//录入学生信息
    void NumStudent();//统计学生人数
    void SearchStudent();//查找学生信息
    void ModifyStudent();//修改学生信息
    void DeleStudent();//删除学生信息
    void PrintStudent();//查看录入信息
    void Help();//使用帮助
    void strrpl(char s1[20],char s2[20]);//字符替换 
    
    
    
    Node* Head;//全局头结点
    
    int main() {
    	system("color 3a");//改变控制台颜色
    	Head = (Node*)malloc(sizeof(Node));
    	Head->next = NULL;//初始化一个头结点
    
    	Welcome();	//欢迎界面
    
    	int n;
    	while (1) {
    		printf("请选择想使用的功能\n");
    		scanf("%d", &n);//输入一个数字
    		switch (n) {
    		case 1: InputStudent();     //1.录入学生信息
    				SaveStudent(); 
    			break;    	
    		case 2: NumStudent();		//2.统计学生信息	
    			break;
    		case 3: SearchStudent();	//3.查找学生信息
    			break;
    		case 4: ModifyStudent();	//4.修改学生信息
    				SaveStudent(); 
    			break;
    		case 5: DeleStudent();		//5.删除学生信息
    				SaveStudent(); 
    			break;
    		case 6: PrintStudent();		//6.查看录入信息
    			break;
    		case 7: Help();				//7.使用帮助
    			break;
    		case 0: exit(0);
    		}
    
    
    	}
    	return 0;
    }
    
    
    //欢迎界面
    void Welcome() {
    	printf("===============================================\n");
    	printf("===========欢迎使用学生管理系统 v1.0===========\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("=               0.退出系统                     =\n");
    	printf("=                                             =\n");
    	printf("===============================================\n");
    }
    
    //读取学生信息
    void ReadStudent(){
    	FILE * fp;
    	char k;
    	if ((fp = fopen("D:\\demo.txt", "r")) == NULL) {	//以只读方式打开文件
    		printf("无学生信息");
    		exit(1);
    	}
    	//从文件读取信息 
    	while (!feof(fp)){
    			Node* p = (Node*)malloc(sizeof(Node));		//初始化一个结点p
    			fscanf(fp,"%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, &p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    			p->next = Head->next;	//头插p结点
    			Head->next = p;
    	}
    }
    
    //保存学生信息
    void SaveStudent() { 
        FILE *fp;
        fp=fopen("D:\\demo.txt","w");		//以只写方式打开文件
        if( fp== NULL ){
        printf("打开文件失败\n");
        exit(1);  //退出程序
        }
    	Node* p = Head->next;
    	while (p != NULL) { 				//依次写入文件
    		fprintf(fp, "%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    		p = p->next;
    	}
    	fclose(fp);
    }
    
    //1.录入学生信息
    void InputStudent() {
    	int x;
    	printf("您想要录入的学生人数:");
    	scanf("%d", &x);
    	int j = 1;
    
    	while (x) {
    		Node* p = (Node*)malloc(sizeof(Node));
    
    		printf("录入第%d个学生信息\n", j++);
    		printf("请输入学生的学号:");
    		scanf("%s", p->stu.stuNum);
    
    		Node* k = Head->next;
    		while (k != NULL) {
    			while (strcmp(p->stu.stuNum,k->stu.stuNum)==0) {
    				printf("该学号已存在,请重新输入!\n");
    				printf("请输入学生的学号:");
    				scanf("%s", p->stu.stuNum);
    			}
    			k = k->next;
    		}
    
    
    		printf("请输入学生的姓名:");
    		scanf("%s", p->stu.stuName);
    
    		printf("请输入学生的性别:");
    		scanf("%s", p->stu.stuSex);
    
    		printf("请输入学生的年龄:");
    		scanf("%d", &p->stu.stuAge);
    
    		printf("请输入学生的班级:");
    		scanf("%s", p->stu.stuClass);
    
    		printf("请输入学生的成绩:");
    		scanf("%s", p->stu.stuScore);
    
    		p->next = Head->next;
    		Head->next = p;
    		x--;
    	}
    
    }
    
    //2.统计学生人数
    void NumStudent(){
    	FILE* fp;
    	char w;
    	int num=0;
    	if ((fp = fopen("D:\\demo.txt", "r")) == NULL) {
    		printf("无学生信息");
    	}else{
    		fp = fopen("D:\\demo.txt", "r");
    		while ((w=fgetc(fp))!=EOF){
        		if(w=='\n'){		//根据换行数统计学生人数
    				num++;
    			}
    		}
    		printf("共有学生%d人\n",num);
    	}
    	
    }
    
    //3.查找学生信息
    void SearchStudent(){
    	int n;
    	char s[20];
    	printf("请选择查找方式\n");
    	printf("1.根据学号查找\n");
    	printf("2.根据姓名查找\n");
    
    	scanf("%d",&n);
    	
    	switch (n){
    	case 1:{
    		ReadStudent();//从文件将链表读入,Head为头结点
    		int flag=0;
    		Node* p=Head->next;
    		printf("请输入想查找的学号:");
    		scanf("%s",s);
    		while(p!=NULL){
    			if(strcmp(p->stu.stuNum,s)==0){					//字符串匹配
    				printf("学号\t姓名\t性别\t年龄\t班级\t成绩\n");
    				printf("%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    				flag=1;
    				break;
    			}
    			p=p->next;
    		}
    		if(flag==0){
    			printf("没有符合条件的学生\n");
    		}
    	}
    		break;
    	
    	case 2:	{
    		ReadStudent();
    		int flag=0;
    		Node* p=Head->next;
    		printf("请输入想查找的姓名:");
    		scanf("%s",s);
    		while(p){
    			if(strcmp(p->stu.stuName,s)==0){
    				printf("学号\t姓名\t性别\t年龄\t班级\t成绩\n");
    				printf("%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    				flag=1;
    				break;
    			}
    			p=p->next;
    		}
    		if(flag==0){
    			printf("没有符合条件的学生");
    		}
    	}
    		break;
    	}
    }
    
    //4.修改学生信息
    void ModifyStudent(){
    	printf("请输入你想修改学生的姓名\n");
    	char s[20];
    	char num[20];
    	char name[20];
    	char sex[20];
    	int age;
    	char classs[20];
    	char score[20];
    	Head->next=NULL;//重要,如果要保存链表,每次读取链表前都要将头指针指向空,不然数据会重复
    	ReadStudent();//读入链表
    	int flag=0;
    	Node* p=Head->next;
    	scanf("%s",s);
    	while(p!=NULL){
    		if(strcmp(p->stu.stuName,s)==0){
    			flag=1;
    			break;
    		}
    		p=p->next;
    	}
    	if(flag==0){
    		printf("没有找到该学生");
    	}else{
    			
    		printf("请输入想修改的内容:\n");
    		printf("1.学生学号\n");
    		printf("2.学生姓名\n");
    		printf("3.学生性别\n");
    		printf("4.学生年龄\n");
    		printf("5.学生班级\n");
    		printf("6.学生成绩\n");
    			
    		int n;
    		scanf("%d",&n);
    		switch(n){
    			case 1: 
    				printf("将学号修改为:");
    				scanf("%s",num);
    				strrpl(p->stu.stuNum,num);  //strrpl为字符串替换函数,见末尾
    				break;
    
    			case 2:
    				printf("将姓名修改为:");
    				scanf("%s",name);
    				strrpl(p->stu.stuName,name);
    				break;
    
    			case 3:
    				printf("将性别修改为:");
    				scanf("%s",sex);
    				strrpl(p->stu.stuSex,sex);
    				break;
    
    			case 4:
    				printf("将年龄修改为:");
    				scanf("%d",&age);	
    				p->stu.stuAge=age;
    				break;
    
    			case 5:
    				printf("将班级修改为:");
    				scanf("%s",classs);
    				strrpl(p->stu.stuClass,classs);
    				break;
    
    			case 6:
    				printf("将成绩修改为:");
    				scanf("%s",score);
    				strrpl(p->stu.stuScore,score);
    				break;
    			}
    		}	
    }
    
    //5.删除学生信息
    void DeleStudent(){
    	Head->next=NULL;//重要,如果要保存链表,每次读取链表前都要将头指针指向空,不然数据会重复
    	ReadStudent();
    	char name[20];
    	Node*p=Head->next;
    	Node*q=Head;
    	printf("要删除学生姓名\n");
    	scanf("%s",name);
    	while(p!=NULL){
    		if(strcmp(p->stu.stuName,name)==0){
    			q->next=p->next;
    			free(p);
    		}
    		q=q->next;
    		p=p->next;
    	}
    }
    
    //6.查看录入信息
    void PrintStudent() {
    	Head->next=NULL;
    	ReadStudent();
    	Node* p=Head->next;
    	while (p){
    		printf("%s\t%s\t%s\t%d\t%s\t%s\n", p->stu.stuNum, p->stu.stuName, p->stu.stuSex, p->stu.stuAge, p->stu.stuClass, p->stu.stuScore);
    		p=p->next;
    	}
    }
    
    //7.使用帮助
    void Help(){
    	printf("1.程序将自动在D盘根目录下新建一个demo.txt文件用来储存学生信息\n");
    	printf("2.根据提示在键盘上选择对应的数字完成交互\n");
    
    }
    
    
    //字符替换 s1替换为s2
    void strrpl(char q1[20],char q2[20]){
    	int i=0,j=0;
    	while(q1[i]!='\0'){
    		q1[i++]='\0';
    	}
    	i=0;
    	while(q2[j]!='\0'){
    		q1[i++]=q2[j++];
    	}
    
    }
    
    展开全文
  • C语言链表知识编出了简单的学生管理系统,可实现创建、查询、删除、排序、保存、读取等功能
  • 学生信息管理系统的功能有,也可以自己增加或者改进一些函数功能。 在main函数里调用这8个函数 学生信息包含姓名、年龄、学号、成绩,需要定义一个结构体(结构体是全局变量,所以需要全局声明): typedef struct ...

    学生信息管理系统的功能有,也可以自己增加或者改进一些函数功能。
     ,,
    在main函数里调用这8个函数
    学生信息包含姓名、年龄、学号、成绩,需要定义一个结构体(结构体是全局变量,所以需要全局声明):

    typedef struct _student{
    	char name[20];
    	int age;
    	int stuNum;
    	int score;
    }student;
    

    需要有一个存储数据的空间,所以使用单链表存储,定义如下:

    typedef struct _Node{
    	student stu1;
    	struct _Node* pNext;
    }Node;
    

    此时需要给链表一个头:

    Node *g_head=NULL;
    

    录入学生信息:
    1)创建一个新节点,结点里包括结构体数据,和下一个指针。
    2)需要判断头结点是不是空的,如果是空的,则此时需要将新节点付给头结点,如果不是空的,那么该结点的下一个指针=头结点(头插法,能用就行)。
    3)然后就输入数据scanf("%s",&p->stu1.age);
    4)最后提示一下该学生信息输入完毕!
    5)现在只输入了一个学生信息,此时只需要在主函数里写一个循环就可以无限调用该函数进行数据录入。

    void input(){
    	printf("请输入学生信息\t\n");
    	Node *pNewNode=(Node*)malloc(sizeof(Node));//创建一个新节点。
    	pNewNode->pNext=NULL;
    	
    	if(g_head==NULL){
    		g_head=pNewNode;
    	}
    	else{
    		pNewNode->pNext=g_head;
    		g_head=pNewNode;
    	}
    	printf("请输入姓名: ");
    	scanf("%s",pNewNode->stu1.name);
    	printf("请输入年龄: ");
    	scanf("%d",&pNewNode->stu1.age);
    	printf("请输入学号 : ");
    	scanf("%d",&pNewNode->stu1.stuNum);
    	printf("请输入成绩 : ");
    	scanf("%d",&pNewNode->stu1.score);
    printf("该学生信息输入完毕!\n\n");
    }
    

    查看信息:
    1)需要对链表进行遍历然后printf;
    2)新建一个结点指针然后 Node* p=g_head; while(p!=NULL){ printf p=p->next}(注:以上代码只是功能的描述)
    代码:

    void printdate(){
    	Node* p=g_head;
    	printf("\t姓名\t年龄\t学号\t成绩\n");
    	while(p!=NULL)
    	{
    		printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
    		p=p->pNext;
    	}
    }
    

    保存信息:
    1)先用文件指针指向一个要使用的文件,
    2)便利所有链表的数据,将遍历的数据写入文件指针指向的文件里

    void save(){
    	FILE *fp=fopen("E:\\stu.data","w");
    	if(fp==NULL){
    		printf("文件打开失败");
    		return;
    	}
    	Node* p=g_head;
    	while(p!=NULL){
    		fwrite(&p->stu1,1,sizeof(student),fp);
    		p=p->pNext;
    	}
    	fclose(fp);
    	printf("文件保存成功!\n");
    }
    

    文件读取
    1)先用文件指针指向一个使用的文件,
    2)这里需要开辟链表来将读取到的数据写入链表里的数据里的结构体里,
    3)需要判断一下是否读取到了数据,将文件里的数据先读到结构体数组里
    4)然后while循环里 ,,将结构体数组里的数据复制给链表,
    5)需要将每一个节点排好队列,这里用头插法,每复制一个就会开辟一个结点,
    代码:

    void rs(){
    	FILE* fp=fopen("E:\\stu.data","r");
    	if(fp==NULL){
    		printf("文件打开失败");
    	}
    	printf("文件读取成功!\n 查看文件请按2\n");
    	student stu;
    	
    	while(fread(&stu,1,sizeof(student),fp)){
    		Node* pNewNode=(Node*)malloc(sizeof(Node));
    		pNewNode->pNext=NULL;
    
    		memcpy(pNewNode,&stu,sizeof(student));
    
    		if(g_head==NULL){
    			g_head=pNewNode;
    
    		}
    		else{
    			pNewNode->pNext=g_head;
    			g_head=pNewNode;
    
    		}
    	}
    	}
    

    统计人数:
    1)遍历链表的时候定义一个整型数组自加最后输出

    void count(){
    	int a=0;
    	FILE* fp=fopen("E:\\stu.data","r");
    	if(fp==NULL){
    		printf("文件打开失败");
    		return;
    	}
    	Node* p=g_head;
    	while(p!=NULL){
    		p=p->pNext;
    		a++;
    	}
    	printf("总人数%d",a);
    }
    
    

    查找学生:
    1)定义整型数据,输入学号,先遍历再if判断输入的学号和p->stu1.num是否相等,相等的话输出:

    void find(){
    	int num;
    	printf("请输入要查找的学生学号: \n");
    	scanf("%d",&num);
    	Node* p=g_head;
    	while(p!=NULL){
    		if(p->stu1.stuNum==num){
    			printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
    		}
    		p=p->pNext;
    	}
    printf("无该学生信息");
    }
    
    

    修改信息:
    1)定义整型数据,输入学号,先遍历再if判断输入的学号和p->stu1.num是否相等,相等的话重新输入:

    void change(){
    	int num;
    	printf("请输入要修改的学生的学号: ");
    	scanf("%d",&num);
    	Node* p=g_head;
    	while(p!=NULL){
    
    		if(p->stu1.stuNum==num){
    			printf("请输入姓名: \n");
    			scanf("%s",p->stu1.name);
    			printf("请输入年龄: \n");
    			scanf("%d",&p->stu1.age);
    			printf("请输入学号: \n");
    			scanf("%d",&p->stu1.stuNum);
    			printf("请输入成绩: \n");
    			scanf("%d",&p->stu1.score);
    			printf("信息更改完毕!");
    		}
    
    		p=p->pNext;
    	}
    	if(p==NULL){
    		printf("该学生不存在!\n");
    	}
    
    }
    
    

    删除信息:
    1)思路是先遍历,找到了free就可以了,
    2)需要定义两个节点指针,如果找到了是头结点直接将头结点付给定义的节点,然后free,
    如果不是头结点,将该节点付给定义的节点,p->next=p->next->next;
    然后free

    void del(){
    	int num;
    
    	printf("请输入要删除的学号");
    	scanf("%d",&num);
    	Node* p=g_head;
    	Node*p1,*p2;
    	if(p->stu1.stuNum==num){
    		p1=p->pNext;
    
    		free(p1);
    
    	}
    	if(p->pNext!=NULL){
    		p2=p->pNext;
    		p->pNext=p->pNext->pNext;
    		free(p2);
    	}
    printf("学号为%d的信息删除成功!\n",num);
    
    }
    

    下面是完整代码:

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>
    typedef struct _student{
    	char name[20];
    	int age;
    	int stuNum;
    	int score;
    }student;
    
    typedef struct _Node{
    	student stu1;
    	struct _Node* pNext;
    }Node;
    
    Node *g_head=NULL;
    void menu(){
    	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("- 0退出-\n");
    	printf("退出不要直接点叉,请按0退出!\n查看文件之前请先读取文件!\n");
    }
    void input(){
    	printf("请输入学生信息\t\n");
    	Node *pNewNode=(Node*)malloc(sizeof(Node));//创建一个新节点。
    	pNewNode->pNext=NULL;
    	
    	if(g_head==NULL){
    		g_head=pNewNode;
    	}
    	else{
    		pNewNode->pNext=g_head;
    		g_head=pNewNode;
    	}
    	printf("请输入姓名: ");
    	scanf("%s",pNewNode->stu1.name);
    	printf("请输入年龄: ");
    	scanf("%d",&pNewNode->stu1.age);
    	printf("请输入学号 : ");
    	scanf("%d",&pNewNode->stu1.stuNum);
    	printf("请输入成绩 : ");
    	scanf("%d",&pNewNode->stu1.score);
    printf("该学生信息输入完毕!\n\n");
    }
    
    void printdate(){
    	Node* p=g_head;
    	printf("\t姓名\t年龄\t学号\t成绩\n");
    	while(p!=NULL)
    	{
    		printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
    		p=p->pNext;
    	}
    }
    
    
    void save(){
    	
    	FILE *fp=fopen("E:\\stu.data","w");
    	if(fp==NULL){
    		printf("文件打开失败");
    		return;
    	}
    	Node* p=g_head;
    	while(p!=NULL){
    		fwrite(&p->stu1,1,sizeof(student),fp);
    		p=p->pNext;
    
    	}
    	fclose(fp);
    	printf("文件保存成功!\n");
    }
    
    
    void rs(){
    	FILE* fp=fopen("E:\\stu.data","r");
    	if(fp==NULL){
    		printf("文件打开失败");
    	}
    	printf("文件读取成功!\n 查看文件请按2\n");
    	student stu;
    	
    	while(fread(&stu,1,sizeof(student),fp)){
    		Node* pNewNode=(Node*)malloc(sizeof(Node));
    		pNewNode->pNext=NULL;
    
    		memcpy(pNewNode,&stu,sizeof(student));
    
    		if(g_head==NULL){
    			g_head=pNewNode;
    
    		}
    		else{
    			pNewNode->pNext=g_head;
    			g_head=pNewNode;
    
    		}
    	}
    	}
    
    
    
    void count(){
    	int a=0;
    	FILE* fp=fopen("E:\\stu.data","r");
    	if(fp==NULL){
    		printf("文件打开失败");
    		return;
    	}
    	Node* p=g_head;
    	while(p!=NULL){
    		p=p->pNext;
    		a++;
    	}
    	printf("总人数%d",a);
    }
    
    
    
    
    void find(){
    	int num;
    	printf("请输入要查找的学生学号: \n");
    	scanf("%d",&num);
    	Node* p=g_head;
    	while(p!=NULL){
    		if(p->stu1.stuNum==num){
    			printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
    		}
    		p=p->pNext;
    	}
    printf("have not");
    }
    
    
    
    void change(){
    	int num;
    	printf("请输入要修改的学生的学号: ");
    	scanf("%d",&num);
    	Node* p=g_head;
    	while(p!=NULL){
    
    		if(p->stu1.stuNum==num){
    			printf("请输入姓名: \n");
    			scanf("%s",p->stu1.name);
    			printf("请输入年龄: \n");
    			scanf("%d",&p->stu1.age);
    			printf("请输入学号: \n");
    			scanf("%d",&p->stu1.stuNum);
    			printf("请输入成绩: \n");
    			scanf("%d",&p->stu1.score);
    			printf("信息更改完毕!");
    		}
    
    		p=p->pNext;
    	}
    	if(p==NULL){
    		printf("该学生不存在!\n");
    	}
    
    }
    
    
    
    void del(){
    	int num;
    
    	printf("请输入要删除的学号");
    	scanf("%d",&num);
    	Node* p=g_head;
    	Node*p1,*p2;
    	if(p->stu1.stuNum==num){
    		p1=p->pNext;
    
    		free(p1);
    
    	}
    	if(p->pNext!=NULL){
    		p2=p->pNext;
    		p->pNext=p->pNext->pNext;
    		free(p2);
    	}
    printf("学号为%d的信息删除成功!\n",num);
    
    }
    
    
    
    int main()
    {
    	menu();
    	while(1)
    	{
    		char ch=getch();
    		switch(ch){
    		case '1':input();break;
    		case '2':printdate();break;
    		case '3':save();break;
    		case '4':rs();break;
    
    
    		case '5':count();break;
    		case '6':find();break;
    		case '7':change();break;
    		case '8':del();break;
    
    
    
    		case '0':exit(0);
    		
    		}
    	}
    
    return 0;
    }
    

    喜欢点赞、评论加收藏哦~!

    展开全文
  • C语言链表实现学生信息管理系统

    千次阅读 多人点赞 2020-06-03 08:27:58
    大一做的这个程序,主要是链表的增删查改操作。.../////////////////学生信息管理系统 /////////////////存入、查找、删除、修改、输出学生信息,学生信息包括姓名,性别,年龄,学号,电话; typedef

    大一做的这个程序,主要是链表的增删查改操作。很好理解,源码如下,可以直接运行

    #include<stdio.h>
    #include<stdlib.h>
    #include<string>
    #define OK 1
    #define ERROR 0;
    #define OVERFLOW -2;
    /学生信息管理系统  
    /存入、查找、删除、修改、输出学生信息,学生信息包括姓名,性别,年龄,学号,电话; 
    typedef struct LNode{
    int data; 
    	char name[10];
    	char sex[10];
    	int old;
    	int id;
    	int tel;
    	struct LNode *next;
    }LNode,*LinkList; 
    // 函数声明 
    LinkList creatlist();
    void disp(LinkList L);
    void search(LinkList L);
    void del(LinkList L);
    void choose();
    void menu();
    void input(LinkList L);
    void change(LinkList L);
    ///主函数入口 
    int main(){
    choose();
    	return 0;
    }
    //选择功能函数  嵌套菜单函数 
    void choose(){
    	//struct LNode *L=NULL;
    	LinkList L=NULL;
    	int n;
    	int a=1;
    	while(a>0){
    	menu();
    printf("请选择功能:");
    scanf("%d",&n);
    switch (n){
    case 1:
    	L=creatlist();
    	break;
    case 2:
    	disp(L);
    	break;
    case 3:
    	search(L);
    	break;
    case 4:
    	del(L);
    	break;
    case 5:
    	input(L);
    	break;
    case 6:
    	change(L);
    	break;
    default:
    	a=-1;
    	break;
    }
    }
    }
    //菜单函数 
    void menu(){
    printf("\n\n");
    printf("\t\t    欢迎使用学生信息管理系统\n      ");
    printf("\t\t1.创建学生信息\n");
    printf("\t\t2.输出学生信息\n");
    printf("\t\t3.查询学生信息\n");
    printf("\t\t4.删除学生信息\n");
    printf("\t\t5.插入学生信息\n");
    printf("\t\t6.修改学生信息\n");
    printf("\t\t7.退出\n");
    }
    ///尾插法带头节点创建单链表 
    LinkList creatlist(){
    //	int val;
    	int n;
    	LinkList L=(LinkList)malloc(sizeof(LNode));
    	LinkList r=NULL;
    	L->next=NULL;
    	r=L;
    	printf("请输入几个学生信息?");
    	scanf("%d",&n);
    	L->data=n;
    	for(int i=0;i<n;i++){
    		LinkList p=(LinkList)malloc(sizeof(LNode));
    	//	p->data=val;
    		printf("第%d个学生的姓名:\n",i+1);
    			scanf("%s",&p->name);
    			printf("第%d个学生的性别:\n",i+1);
    			scanf("%s",&p->sex);
    			printf("第%d个学生的年龄:\n",i+1);
    			scanf("%d",&p->old);
    			printf("第%d个学生的学号:\n",i+1);
    			scanf("%d",&p->id);
    			printf("第%d个学生的电话:\n",i+1);
    			scanf("%d",&p->tel);
    		p->next=NULL;
    		r->next=p;
    		r=p;	
    	}
    	return L;
    }输出函数 
    void disp(LinkList L){
    	//LinkList p=L->next;
    LinkList p=NULL;
    p=L;
    	if(p==NULL){
    		printf("暂无数据!");
    	}	
    	else{		printf("共有%d个学生信息!\n",L->data);
    	for(int i=0;i<L->data;i++){
    	p=p->next;
    		printf("姓名:%s\n",p->name);
    		 	printf("性别:%s\n",p->sex); 
    		 		printf("年龄:%d\n",p->old);
    		 			printf("学号:%d\n",p->id);
    		 				printf("电话:%d\n",p->tel);
    						 printf("\n\n")	;}		
    	}	
    	}
    /查找 
    void search(LinkList L){
    	int a;
    //	LinkList p=L->next;
    	LinkList p=L; 
    	printf("您要查找的学生学号是:\n");
    	scanf("%d",&a);
    	for(int i=0;i<L->data;i++){
    		p=p->next;
    		if(a==p->id){
    				printf("查找成功!");
    			printf("姓名:%s",p->name);
    		 	printf("性别:%s\n",p->sex); 
    		 		printf("年龄:%d",p->old);
    		 			printf("学号:%d",p->id);
    		 				printf("电话:%d",p->tel);break;
    		}
    		else{
    			printf("查无此人!");
    		}
    	}
    
    }
    //
    
    ///删除函数 
    void del(LinkList L){
    	int a;
    	int j=1;
    	int i; 
    LinkList p=L;
    LinkList q=NULL;
    if(p==NULL){
    	printf("暂无数据!");
    	return;
    }
    if(p!=NULL){
    printf("删除学生的学号是:");
    scanf("%d",&a);
    for(i=1;i<L->data;i++){
    	if(a==p->next->id){
    		printf("查找成功!");
    	q=p->next;
    		p->next=q->next;
    		delete q;
    		printf("删除成功!");
    		L->data=L->data-1;
    		break;
    	}
    	else{
    		printf("不存在该学生 请检查输入学号是否有误!"); 
    	}
    	p=p->next;
    }
    }
    }
    /插入函数 
    void input(LinkList L)
    {
    LinkList p=L;
    int i;int j;
    	if(p==NULL){
    	printf("您还未创建学生信息!");
    	return;
    	}
    
    	else{
    		printf("插入到第几个节点?");
    	scanf("%d",&i);
    
    	if(i>0&&i<=L->data){		
    	for(j=0;j<i-1;j++){
    		p=p->next;		
    		}	
    		LinkList s=(LinkList)malloc(sizeof(LNode));
    		printf("姓名:\n");
    		scanf("%s",&p->name);
    		 	printf("性别:\n"); 
    		 		scanf("%s",&p->sex);
    		 		printf("年龄:\n");
    		 			scanf("%d",&p->old);
    		 			printf("学号:\n");
    		 				scanf("%d",&p->id);
    		 				printf("电话:\n");
    				scanf("%d",&p->tel);		
    		s->next=p->next;
    		p->next=s;	
    		L->data=L->data+1;
    	}   
    	else printf("不存在的节点!");
    }
    } 
    /修改函数 
    void change(LinkList L) {
    	LinkList p=L;
    	int i,j;
    	int a; 
    	if(p==NULL){
    		printf("你还未创建链表!"); 
    		return;
    	}
    	
    	else{printf("您要修改的学生信息的学号是:"); 
    	scanf("%d",&a);
    	for(i=0;i<L->data;i++){
    		p=p->next;
    		if(a==p->id){
    			printf("查找成功!\n");
    			printf("姓名修改为:\n");
    			scanf("%s",&p->name);
    			printf("性别修改为:\n");
    			scanf("%s",&p->sex);
    			printf("年龄修改为:\n");
    			scanf("%d",&p->old);
    			printf("学号修改为:\n");
    			scanf("%d",&p->id);
    			printf("修改成功\n");
    			break;
    		}
    		else{
    			printf("不存在的学生信息!请检查信息输入是否有误\n");
    		}
    	}			
    }   }
    

    运行效果截图:
    在这里插入图片描述

    展开全文
  • c语言实现, 链表初学使用, 文件读写, 已通过测试
  • 能完美运行 包含功能: 1、输入:函数input把20学生的学号、姓名、性别、年龄、四科成绩以及平均成绩和总成绩放在一个结构体数组中,学生的学号、姓名、四科成绩由键盘输入,然后计算出平均成绩和总成绩放在结构体...
  • 学生管理系统C语言综合链表实现)

    千次阅读 多人点赞 2019-04-08 14:39:39
    学生管理系统C语言综合链表实现) 题目:定义单向链表类型StuLink,链表结点包含xh、xm、cj、dj、mc、nxet六个数据项,分别代表学生的学号、姓名、成绩、等级、名次和指向下一个结点的指针,其中:学号、姓名、...

    学生管理系统(C语言综合链表实现)

    题目:定义单向链表类型StuLink,链表结点包含xh、xm、cj、dj、mc、nxet六个数据项,分别代表学生的学号、姓名、成绩、等级、名次和指向下一个结点的指针,其中:学号、姓名、成绩是输入项,等级、名次是计算项。请按如下功能要求设计一个学生成绩管理程序,编程要求:

    ⑴ 设计main函数(10分):建立一个菜单系统,调用Creat_Link函数建立一个StuLink类型的学生链表;调用Insert_Node函数在链表尾插入一个新结点;调用Edit_Node函数修改链表中指定学号的结点;调用Delete_Node函数删除链表中指定学号的结点;调用Query_Node函数查询链表中指定学号的结点并显示查询结果;调用Rank_Link函数计算学生链表中每个学生的名次;调用Analysis_Link函数统计并返回各等级人数;调用Output_Link函数按指定数据项的顺序【学号(升序),或者,成绩(降序)】输出学生成绩表、各等级人数。
    ⑵ 设计Creat_Link函数(10分):建立一个StuLink类型的学生链表,返回链表头指针。每个链表结点代表一个学生信息,要求输入学号、姓名和成绩,其中:学号从1开始按递增1自动生成,成绩必须在[0,100]区间的整数,当输入成绩为-1时,表示输入结束。
    ⑶ 设计Insert_Node函数(10分):在链表尾插入一个新结点。新结点的学号是链表中最大学号加1,姓名和成绩从键盘输入(注意:成绩必须在[0,100]区间的整数),根据成绩计算等级。注意:插入结点会导致链表中各结点名次的变化。
    ⑷ 设计Edit_Node函数(10分):修改链表中指定学号的结点(注意:学号不能修改,成绩必须在[0,100]区间的整数)。注意:当修改成绩时会导致等级和名次的变化。
    ⑸ 设计Delete_Node函数(10分):删除链表中指定学号的结点。注意:删除操作需要重新计算链表中各结点的名次。
    ⑹ 设计Query_Node函数(10分):查询链表中指定学号的结点,并显示查询结果。
    ⑺ 设计Rank_Link函数(10分):计算学生链表中每个学生的名次。名次规则:按成绩降序排名,从第1名开始依次排名,若出现并列名次,则名次需要叠加。例如,若出现5个并列第1名,则没有第2名,下一个名次是第6名,依此类推。
    ⑻ 设计Analysis_Link函数(10分):统计并返回各等级人数。等级标准:
    A:90及以上 B:80及以上 C:70及以上 D:60及以上 E:60以下
    ⑼ 设计Sort_Link函数(10分):按指定数据项的顺序【学号(升序),或者,成绩(降序)】对学生链表进行排序。
    ⑽ 设计Output_Link函数(10分):按指定数据项的顺序【学号(升序),或者,成绩(降序)】输出学生成绩表、各等级人数。学生成绩表每行输出一个学生信息(依次为学号、姓名、成绩、等级和名次,各项间以1个空格隔开),各等级人数分行输出。

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    struct StuLink
    {
    	int xh;
    	char xm[20];
    	int cj;
    	char dj;
    	int mc;
    	struct StuLink *next;
    };
    
    
    struct StuLink* Creat_Link(struct StuLink* head);		//建立一个StuLink类型的学生链表
    struct StuLink* Insert_Node(struct StuLink * head);		//在链表尾插入一个新结点
    struct StuLink* Edit_Node(struct StuLink* head);		//修改链表中指定学号的结点
    struct StuLink* Delete_Node(struct StuLink* head);		//删除链表中指定学号的结点
    struct StuLink* Rank_Link(struct StuLink* head);		//计算学生链表中每个学生的名次
    void Query_Node(struct StuLink* head);					//查询链表中指定学号的结点
    void Analysis_Link(struct StuLink *head);				//统计并返回各等级人数
    void Sort_Link(struct StuLink* head,int n);				//按指定数据项的顺序(学号升序)(成绩降序)进行排序
    void Output_Link(struct StuLink *head,int n)			//按指定数据项的顺序(学号升序)(成绩降序)输出成绩 
    void display_by_xh(struct StuLink* head);				//将学生节点按学号升序排序 
    void display_by_cj(struct StuLink* head);				//将学生节点按学成绩降序排序
    void swap(struct StuLink* p1, struct StuLink* p2);		//交换两个节点的值 
    
    int main()
    {
    	int n;
    	struct StuLink *head=NULL;
    	while(1)
    	{
    		system("cls");
    		printf("     主菜单—学生成绩管理      \n");
    		printf(" =============================\n");
    		printf("|1-创建链表  	2-链表维护    |\n");
    		printf("|3-计算排序     4-统计分析    |\n");
    		printf("|5-报表输出     0-退出        |\n"); 
    		printf(" =============================\n");
    		printf("     请输入菜单编号(0-5):");
    		scanf("%d",&n);
    		while(!(n==1 || n==2 || n==3 || n==4 || n==5 || n == 0 ) )
    		{
    			printf("输入错误,请重新输入"); 
    			scanf("%d",&n);
    		}
    		if(n==0)
    		{
    			printf("感谢使用成绩管理系统,谢谢!");
    			break;
    		}
    		switch(n)
    		{
    			case 1:
    				head=Creat_Link(head);
    				fflush(stdin);
    				printf("\n按回车键继续\n"); 
    				getchar();
    				break;
    			case 2:
    				while(1)
    				{
    					system("cls");
    					printf("  二级菜单—链表维护管理\n");
    					printf(" ======================\n");
    					printf("|  1-添加一个学生信息  |\n");
    					printf("|  2-修改一个学生信息  |\n");
    					printf("|  3-删除一个学生信息  |\n");
    					printf("|  4-查询一个学生信息  |\n");
    					printf("|  0-退回上级菜单      |\n");
    					printf(" ======================\n");
    					printf("  请输入菜单编号(0-4):");
    					scanf("%d",&n);
    					while(!(n==1 || n==2 || n==3 || n==4 || n==5 || n == 0 ))
    					{
    						printf("输入错误,请重新输入"); 
    						scanf("%d",&n);
    					}
    					if(n==0)break;
    					else 
    						switch(n)
    						{
    							case 1:head=Insert_Node(head);break;
    							case 2:head=Edit_Node(head);break;
    							case 3:head=Delete_Node(head);break;
    							case 4:Query_Node(head);break;
    						}
    					fflush(stdin);
    					printf("请按回车键继续");
    					getchar();
    				}
    				break;
    			case 3:
    				while(1)
    				{
    					system("cls");
    					printf("        二级菜单—计算排序管理\n");
    					printf(" ======================================\n");
    					printf("|  1-计算学生名次    2-按学号升序排序  |\n");
    					printf("|  3-按成绩降序排序  0-返回上级菜单    |\n");
    					printf(" ======================================\n");
    					printf("         输入菜单编号(0-3): "); 
    					scanf("%d",&n);
    					while(!(n==1 || n==2 || n==3 || n == 0 ) )
    					{
    						printf("输入错误,请重新输入"); 
    						scanf("%d",&n);
    					}
    					if(n==0)break;
    					else 
    						switch(n)
    						{
    							case 1:head=Rank_Link(head),display_by_xh(head);break;
    							case 2:Sort_Link(head,2);break;
    							case 3:Sort_Link(head,3);break;
    						}
    					fflush(stdin);
    					printf("请按回车键继续");
    					getchar();
    
    				}
    				break;
    			case 4:
    				Analysis_Link(head);
    				fflush(stdin);
    				printf("请按回车键继续");
    				getchar();
    				break;
    			case 5:
    				while(1)
    				{
    					system("cls");
    					printf("        二级菜单—报表输出管理\n");
    					printf(" ========================================\n");
    					printf("|  1-学号升序  2-成绩降序 0-返回上级菜单 |\n"); 
    					printf(" ========================================\n");
    					printf("           输入菜单编号(0-2): "); 
    					scanf("%d",&n);
    					while(!(n==1 || n==2 || n==3 || n == 0  ) )
    					{
    						printf("输入错误,请重新输入"); 
    						scanf("%d",&n);
    					}
    					if(n==0)break;
    					else 
    						switch(n)
    						{
    							case 1:Output_Link(head,1);break;
    							case 2:Output_Link(head,2);break;
    						}
    					fflush(stdin);
    					printf("请按回车键继续");
    					getchar();
    				}
    
    		}
    
    	}
    	return 0;
    }
    
    
    struct StuLink* Creat_Link(struct StuLink* head)
    {
    	struct StuLink *p1=NULL, *p2=NULL;
    	int score=0,i=1;
    	char name[20];
    	printf("请输入学生姓名和成绩\n");
    	printf("(输入成绩为-1结束输入):\n");
    	while(1)
    	{
    		scanf("%s%d",name,&score);
    		while(!(score>=0 && score<=100) && score != -1)
    		{
    			printf("输入成绩错误,请重新输入:");
    			scanf("%s%d",name,&score);
    		}
    		if(score == -1)break;		
    		if((p1=(struct StuLink *)malloc(sizeof(struct StuLink)))==NULL)
    		{
    			printf("error");
    			exit(0);
    		}
    		p1->next=NULL; 	//当链表只有一个结点时,head的next为NULL 
    		p1->xh=i++;		//创建链表时学号自动生成 
    		strcpy(p1->xm,name);
    		p1->cj=score;
    		if(score>=90) p1->dj='A';
    		else if(score>=80 && score<90) p1->dj='B';
    		else if(score>=70 && score<80) p1->dj='C';
    		else if(score>=60 && score<70) p1->dj='D';
    		else p1->dj='E';
    		if(i==2)head=p1;
    		else p2->next=p1;
    		p2=p1;	
    	}
    
    	head=Rank_Link(head);
    	printf("\n名次计算结果和链表创建结果如下:\n"); 
    	display_by_xh(head); 
    	return head;
    }
    
    struct StuLink* Insert_Node(struct StuLink * head)
    {
    	struct StuLink *p1=head,*p0=NULL,*p2=NULL;
    	char name[20];
    	int score;
    	printf("请输入姓名和成绩:\n");
    	scanf("%s%d",name,&score);
    	while(!(score>=0 && score<=100) )
    	{
    		printf("输入成绩错误,请重新输入"); 
    		scanf("%s%d",name,&score);
    	} 
    	if((p0=(struct StuLink *)malloc(sizeof(struct StuLink)))==NULL)
    	{
    		printf("error");
    		exit(0);
    	}
    	strcpy(p0->xm,name);
    	p0->cj=score; 
    	if(score>=90) p0->dj='A';
    	else if(score>=80 && score<90) p0->dj='B';
    	else if(score>=70 && score<80) p0->dj='C';
    	else if(score>=60 && score<70) p0->dj='D';
    	else p0->dj='E';
    	p0->next=NULL;
    	if(p1==NULL)
    	{
    		p0->xh=1;			//若链表为空,学号为1 
    		head=p0,head->next=NULL;
    	} 
    	else
    	{
    		while(p1!=NULL)	//若不为空 
    		{
    			p2=p1;
    			p1=p1->next;
    		}	
    		p0->xh=p2->xh+1;		//新成学号为最大学号加一
    		p2->next=p0; 
    	}
    	head=Rank_Link(head);
    	printf("\n名次计算结果和链表插入结果如下:\n");
    	display_by_xh(head); 
    	return head;
    
    }
    
    struct StuLink* Rank_Link(struct StuLink* head)
    {
    	int i,count=0;
    	struct StuLink* p1=NULL,*p2=NULL;
    	for(p1=head;p1!=NULL;p1=p1->next)
    	{
    		for(p2=head;p2!=NULL;p2=p2->next)
    		{
    			if(p1->cj < p2->cj)count++;
    		}
    		p1->mc=count+1;
    		count=0;
    	}
    	return head;
    } 
    
    struct StuLink* Edit_Node(struct StuLink* head)
    {
    	struct StuLink *p=head;
    	int num;
    	printf("请输入要修改学生的学号:");
    	scanf("%d",&num);
    	while( p->xh != num && p->next!=NULL)
    	{
    		p=p->next;
    	}
    	if(p->xh==num)
    	{
    		int score;
    		char name[20];
    		printf("学号=%d,姓名=%s,成绩=%d,等级=%c,名次=%d\n",p->xh,p->xm,p->cj,p->dj,p->mc);
    		printf("请输入姓名和成绩:\n");
    		scanf("%s%d",name,&score);
    		while(!(score>=0 && score<=100) )
    		{
    			printf("输入成绩错误,请重新输入"); 
    			scanf("%s%d",name,&score);
    		}
    		strcpy(p->xm,name);
    		p->cj=score; 
    		if(score>=90) p->dj='A';
    		else if(score>=80 && score<90) p->dj='B';
    		else if(score>=70 && score<80) p->dj='C';
    		else if(score>=60 && score<70) p->dj='D';
    		else p->dj='E';
    		head=Rank_Link(head);
    		printf("\n名次计算结果和链表修改结果如下:\n");
    		display_by_xh(head);
    	}
    	else printf("该学号学生不存在\n"); 
    	return head;
    }
    
    struct StuLink* Delete_Node(struct StuLink* head)
    {
    	struct StuLink *p1,*p2;
    	int num;
    	printf("请输入删除的学生学号:");
    	scanf("%d",&num); 
    	p1=head;
    	while( num != p1->xh &&  p1->next!=NULL)
    	{
    		p2=p1;
    		p1=p1->next;
    	}
    	if(p1->xh==num)
    	{
    		if(head==p1)head=p1->next;
    		else p2->next=p1->next;
    		printf("删除成功\n");
    		head=Rank_Link(head);
    		printf("\n名次计算结果和链表删除结果如下:\n");
    		display_by_xh(head); 
    	}
    	else printf("找不到学号为%d的学生\n",num);
    	return head;
    }
    
    void Query_Node(struct StuLink* head)
    {
    	struct StuLink *p1=head;
    	int num;
    	printf("请输入要查询的学生学号:");
    	scanf("%d",&num);
    	while( num != p1->xh &&  p1->next!=NULL)
    	{
    		p1=p1->next;
    	}
    	if(p1->xh == num)
    	{
    		printf("学号=%d, 姓名=%s, 成绩=%d, 等级=%c 名次=%d \n",p1->xh,p1->xm,p1->cj,p1->dj,p1->mc);
    	}
    	else printf("找不到学号为%d的学生\n",num); 
    }
    
    void Analysis_Link(struct StuLink *head)
    {
    	int a[5]={0},i;
    	struct StuLink *p1=head;
    	while(p1 !=  NULL)
    	{
    		if(p1->dj == 'A') a[0]++;
    		else if(p1->dj == 'B') a[1]++;
    		else if(p1->dj == 'C') a[2]++;
    		else if(p1->dj == 'D') a[3]++;
    		else if(p1->dj == 'E') a[4]++;
    		p1=p1->next;
    	}
    	printf("A:90分及以上  B:80分及以上  C:70分及以上  D:60分及以上 E:60分以下\n");
    	printf("A级人数=%d\n",a[0]);
    	printf("B级人数=%d\n",a[1]);
    	printf("C级人数=%d\n",a[2]);
    	printf("D级人数=%d\n",a[3]);
    	printf("E级人数=%d\n",a[4]);
    }
    
    void Output_Link(struct StuLink *head,int n)
    {
    	if(n==1)display_by_xh(head);
    	else display_by_cj(head);
    }
    
    void Sort_Link(struct StuLink* head,int n)
    {
    	if(n==2)display_by_xh(head);
    	else display_by_cj(head);
    }
    
    void display_by_xh(struct StuLink* head)
    {	
    	struct StuLink *p=NULL, *p1=NULL;
    	for(p=head;p!=NULL;p=p->next)
    		for(p1=p->next;p1!=NULL;p1=p1->next)
    			if(p->xh > p1->xh)swap(p,p1); 
    	printf("学号\t\t姓名\t成绩\t等级\t名次\n");
    	for(p=head;p!=NULL;p=p->next)
    		printf("%d\t\t%s\t%d\t%c\t%d\n",p->xh,p->xm,p->cj,p->dj,p->mc);
    }
    
    void display_by_cj(struct StuLink* head)
    {
    	struct StuLink* p=NULL,*p1=NULL;
    	for(p=head;p!=NULL;p=p->next)
    		for(p1=p->next;p1!=NULL;p1=p1->next)
    			if(p->cj < p1->cj)swap(p,p1); 
    	printf("学号\t\t姓名\t成绩\t等级\t名次\n");
    	for(p=head;p!=NULL;p=p->next)
    		printf("%d\t\t%s\t%d\t%c\t%d\n",p->xh,p->xm,p->cj,p->dj,p->mc);
    }
    
    void swap(struct StuLink* p1, struct StuLink* p2)
    {
    	int temp;
    	char c_temp;
    	char t_name[20];
    	c_temp=p1->dj,p1->dj=p2->dj,p2->dj=c_temp;
    	strcpy(t_name,p1->xm);
    	strcpy(p1->xm,p2->xm);
    	strcpy(p2->xm,t_name);
    	temp=p1->xh, p1->xh=p2->xh, p2->xh=temp;
    	temp=p1->cj, p1->cj=p2->cj, p2->cj=temp;
    	temp=p1->mc, p1->mc=p2->mc, p2->mc=temp;
    } 
    
    展开全文
  • 主要为大家详细介绍了C语言链表实现学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • C语言链表实现学生管理系统

    千次阅读 2020-04-30 23:16:59
    2. 可随时添加学生信息,将新加入的学生信息按学号顺序添加到链表中 3. 设计遍历输出函数 3. 设计查找函数,根据学号查找或姓名查找 5. 可随时删除学生信息,根据学号删除 #!/usr/bin/env C # -*- coding:utf-...
  • } void allOut(C* class0) {//输出整个链表 if (class0->next == NULL) { printf("班级为空!\n"); return; } C* p = class0->next; printf("姓名\t学号\t年龄\t\t数学成绩\t英语成绩\t物理成绩\t总成绩\n...
  • 学生信息管理系统c语言版(基于文件,链表)/*基于文件储存的学生管理系统*//*总结:链表的排序采用了交换数据,而非交换节点,应该改进一下。*/#include#include#include#include/*定义接口*/struct student{long id;...
  • C语言版-学生信息管理系统链表实现)

    千次阅读 多人点赞 2019-07-21 13:56:37
    #include<stdio.h> #include<stdlib.h> #include<string.h> #define M 2 #define N 4 typedef struct score//定义成绩结构体 ...//c语言 int english;//英语 double ave;//...
  • c语言学生管理系统 (动态链表 多文件)
  • c语言实践——学生信息管理系统(链表),使用链表和文件。#include #include #include #include #include#define LEN sizeof(struct student)#define DAT_FILENAME "Information.txt"/**********************定义数据...
  • 基于链表学生管理系统基于链表学生管理系统前言功能整体思路Function.hFunction.cpp主文件StudentManageSystem.cpp各函数详细说明保存读取查找添加添加列表修改链表有序归并(为链表排序函数做基础)链表排序...
  • 又到一年大型实验时,这个是我帮同学做的,自认为很土——正是为此所以显得真实,像是初学者作品。本资源适合稍作修改交差应付,不推荐做参考学习。
  • 基于文件、链表c语言学生信息管理系统,在vc++6.0下通过编译运行,本代码提供一些实现思路,可以在进行一些相关的扩展
  • printf(" 学生成绩管理系统 \n"); printf("请选择以下操作:\n"); printf("1.初始化写入学生成绩(暂存于链表中)\n"); printf("2.查询学生成绩\n"); printf("3.更改学生成绩\n"); printf("4.增加学生成绩记录\n");...
  • 学生成绩管理系统-C语言链表

    千次阅读 2020-07-20 13:47:32
    学生成绩管理系统绝对是我们课设的经典选题之一,那么今天就给大家带来一个链表版本的学生成绩管理系统,希望对大家的学习有所帮助,这个项目采用链表这一数据结构最为底层的存储框架,然后是用文件对数据进行一个...
  • 这是一个学生管理系统,基于C语言实现,实现增删查改等基本操作,外加设置管理员登录模块。还拓展其他有趣的功能,开发环境VS2012
  • 第一次写博客,今天学习了C语言链表的相关知识,自己实现了一个很简单的学生成绩管理系统,同时也温习了一下多文件编程,想和大家分享一下自己从中的一些经验和感受。 头文件 //List.h 包含结构体的定义 #...
  • C语言链表实现的学生管理系统,codeblock已测试,附带广工C++课设报告

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,162
精华内容 2,864
关键字:

学生管理系统c语言链表

c语言 订阅