700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 学生信息管理系统_C语言实现_单链表

学生信息管理系统_C语言实现_单链表

时间:2019-11-16 18:36:54

相关推荐

学生信息管理系统_C语言实现_单链表

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

**项目名称:学生信息管理系统**语言:C语言使用的数据结构:单链表_头插法_来存储学生的信息 作者:关水水备注:制作学生信息系统学生信息的查询学生信息的输入学生信息的打印学生信息的保存统计目前所有的学生人数学生信息的修改学生信息的增加学生信息的删除学生信息的导出系统的退出开始时间:.07.08截止时间:.07.11

.c文件源码:

/* 项目名称:学生信息管理系统语言:C语言使用的数据结构:单链表_头插法_来存储学生的信息 作者:关水水备注:制作学生信息系统学生信息的查询学生信息的输入学生信息的打印学生信息的保存统计目前所有的学生人数学生信息的修改学生信息的增加学生信息的删除学生信息的导出系统的退出链接:/video/BV13z4y117qC?p=4&spm_id_from=pageDriver&vd_source=7c3b0ba3dc2b79a3af3a86fcc97eec91开始时间:.07.08截止时间:.07.11**/ #include "StudentManageSystem.h"int main(){while(1){Welcome_entrance();// 函数调用 char ch=getch(); // 从键盘接收一个字符 /* 另外的方式: scanf输入后需要敲回车才可被接收 *getchar()输入后需要敲回车才可被接收 *getch() 需要戴上#include <conio.h>该头文件 */ switch (ch) //括号里面只能存放整数类型而char类型在内存中是以ASCII码储存的 而 ASCII码也是整数类型 所以可以 {case '1'://1.录入学生信息InputStudentInfo();// 函数调用 break;//跳出switch语句,不让它继续执行下一个case case '2'://2.打印录入的学生信息PrintStudntInfo(); break;case '3'://3.保存学生信息SaveStudentInfo();break;case '4'://4.读取文件原有学生信息ReadStudentInfo();break;case '5'://5.统计所有学生人数CountStudent();break;case '6'://6.查找学生信息{Node* p=FindStudent();if(p!=NULL){printf("姓名:%s\t学号:%d\t年龄:%d\t总评成绩:%d\t\n",p->stu.name,p->stu.stuNum,p->stu.age,p->stu.score);}else{printf("没有查询至该学生的信息!\n");}system("pause"); //系统暂停system("cls");//系统清屏 break;}case '7'://7.修改学生信息ModifyStudent();break;case '8'://8.删除学生信息DeleteStudent();break;case '0'://0.退出系统printf("您已经退出系统!\n");return 0;default:printf("您的输入有误,请重新输入.\n");system("pause"); //系统暂停system("cls");//系统清屏 break;}}return 0;}//学生管理系统界面入口void Welcome_entrance() // 函数体 带() 且不需要;{printf("*************************************************\n");// 换行符 \n 49个* printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");// 水平制表符 \t 类似Tab键 相当于8个空格 printf("*************************************************\n");printf("*\t\t请选择功能列表\t\t\t*\n");printf("*************************************************\n");printf("*\t\t1.录入学生信息\t\t\t*\n");printf("*\t\t2.打印录入的学生信息\t\t*\n");printf("*\t\t3.保存学生信息\t\t\t*\n");printf("*\t\t4.读取原有学生信息\t\t*\n");printf("*\t\t5.统计所有学生人数\t\t*\n");printf("*\t\t6.查找学生信息\t\t\t*\n");printf("*\t\t7.修改学生信息\t\t\t*\n");printf("*\t\t8.删除学生信息\t\t\t*\n");printf("*\t\t0.退出系统\t\t\t*\n");printf("*************************************************\n");printf("*\t\t请输入您的选项:\t\t*\n");}// 1.录入学生信息void InputStudentInfo(){// 创建一个新节点可以理解为是要插入的学生的信息节点 Node* pNewNode=(Node*)malloc(sizeof(Node));// 向内存申请一个"节点"大小的空间 返回一个 pNewNode新节点的指针类型pNewNode->pNext=NULL; // 此时这是一个头节点也是一个尾节点,且尾节点的指针域为Null // 头插法、尾插法来实现学生信息的插入// 分情况讨论,当头节点为空以及头节点不为空时if(g_pHead==NULL){g_pHead=pNewNode;// 当头节点为空的时候,将创建的新的要插入的学生信息节点设置为头节点 }else{pNewNode->pNext=g_pHead;//当头节点不为空时,所创建的新节点的下一个地址指向原本的头节点g_pHead=pNewNode;//此时,将头节点指向新插入的学生信息的节点 }printf("请输入学生的姓名:");scanf("%s",pNewNode->stu.name);//从键盘格式化接收一个字符串,整数等等 printf("请输入学生的学号:");scanf("%d",&pNewNode->stu.stuNum);// &取地址运算符 printf("请输入学生的年龄:");scanf("%d",&pNewNode->stu.age);printf("请输入学生的总评成绩:");scanf("%d",&pNewNode->stu.score); printf("学生信息录入成功!\n");//\n:换行符system("pause"); //系统暂停system("cls");//系统清屏 }//2.打印学生信息void PrintStudntInfo(){system("cls");//系统清屏 printf("*************************************************\n");printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");// 水平制表符 \t 类似Tab键 相当于8个空格 printf("*************************************************\n");printf("*\t姓名\t学号\t年龄\t总评成绩\t*\n");printf("*************************************************\n");//遍历链表 Node* p=g_pHead;//设置一个p节点指针指向头节点while(p!=NULL)//只要p节点不等于空那么就开始遍历 {printf("*\t%s\t%d\t%d\t%d\t\t*\n",p->stu.name,p->stu.stuNum,p->stu.age,p->stu.score);p=p->pNext;} printf("*************************************************\n");system("pause"); //系统暂停system("cls");//系统清屏 }//3.保存学生信息void SaveStudentInfo(){system("cls");//系统清屏 //打开文件FILE* fp=fopen("D:\\StuManageSystemdata\\StuManageSystemdata.data","w"); //打开文件,写入操作,返回一个指针fp if(fp==NULL)//如果没有该文件时那么提示报错打开文件失败 {printf("打开文件失败,无法保存信息!\n");return;}//遍历链表Node* p=g_pHead;while(p!=NULL){fwrite(&p->stu,1,sizeof(Student),fp);//执行写入操作//stu结构体的地址每次写入1个字节大小为该结构体的大小返回fp指针,写入至相应文件夹 p=p->pNext;} //关闭文件fclose(fp);printf("\n数据保存成功!\n");system("pause"); //系统暂停system("cls");//系统清屏 }//4.读取原有学生信息void ReadStudentInfo(){//打开文件FILE* fp=fopen("D:\\StuManageSystemdata\\StuManageSystemdata.data","r"); //FILE与NULL 同理,全部大写,否则报错[Error] unknown type name 'File'if(fp==NULL){printf("打开文件失败!\n");return;}//读文件Student stu;//这里不是特别明白?????????????????????????????? while(fread(&stu,1,sizeof(Student),fp)) //当要读取文件的字节大于>0,则执行读文件操作 {//创建一个新节点Node* pNewNode=(Node*)malloc(sizeof(Node));pNewNode->pNext=NULL;memcpy(pNewNode,&stu,sizeof(Student));//复制节点 //需要添加头文件 #include <string.h>//头插法if(g_pHead==NULL){g_pHead=pNewNode; }else{pNewNode->pNext=g_pHead;g_pHead=pNewNode;}}//关闭文件fclose(fp); printf("加载数据成功!请选择选项2进行打印!\n");system("pause"); //系统暂停system("cls");//系统清屏 }//5.统计所有学生人数void CountStudent(){int nCount=0;//学生总数//链表遍历Node* p=g_pHead;while(p!=NULL){nCount++;p=p->pNext;} printf("学生的总人数为:%d\n",nCount);system("pause"); //系统暂停system("cls");//系统清屏 }//6.查找学生信息Node* FindStudent(){int nStuNum;//要查找的学生的学号 char sName[20];//要查找的学生的姓名printf("请输入要查找的学生的学号:\n");scanf("%d",&nStuNum);printf("请输入要查找的学生的姓名:\n");scanf("%s",sName);Node* p=g_pHead;while(p!=NULL){//将输入的信息与链表中的信息进行比较//strcmp字符串比较函数,相等取值为0 if(p->stu.stuNum==nStuNum||0==strcmp(p->stu.name,sName)){return p;}p=p->pNext;}//没有找到则返回NULLreturn NULL; }//7.修改学生信息void ModifyStudent(){int nStuNum; //newStudentNumberprintf("请输入需要修改的学生的信息的学号:\n");scanf("%d",&nStuNum);Node* p=g_pHead;//申请一个新节点指向头节点while(p!=NULL){// strcmp字符串比较函数if(p->stu.stuNum==nStuNum){printf("需要修改的学生的原有信息如下:姓名:%s\t学号:%d\t年龄:%d\t总评分数:%d\t\n",p->stu.name,p->stu.stuNum,p->stu.age,p->stu.score);printf("请输入要修改的学生姓名,年龄,成绩:\n");scanf("%s %d %d",p->stu.name,&p->stu.age,&p->stu.score);printf("修改成功.\n");printf("修改后的学生信息如下:姓名:%s\t学号:%d\t年龄:%d\t总评分数:%d\t\n",p->stu.name,p->stu.stuNum,p->stu.age,p->stu.score);break;} p=p->pNext;} if(p==NULL)//输入的学号不存在的情况下 {printf("没有找到该学生信息.\n");}system("pause"); //系统暂停system("cls");//系统清屏 }//8.删除学生信息void DeleteStudent(){int nStuNum;//newStuedentNumberprintf("请输入要删除的学生的学号:\n");scanf("%d",&nStuNum); Node* p1,*p2;//判断要删除的节点是不是头节点两者学号比较即可 //如果是头节点, 让原有头节点的内容备份给节点p1,通过释放p1,达到删除头节点的目的 //同时,记得让原来的头节点的下一个节点成为新的头节点 if(g_pHead->stu.stuNum==nStuNum)//记住是==号,否则只会删除第一列数据 {p1=g_pHead;g_pHead=g_pHead->pNext;free(p1);printf("删除成功!\n");system("pause"); //系统暂停system("cls");//系统清屏 return;} //如果不是头节点 //节点顺序如下://p(g_pHead) p2(p->next)p->next->nextNode* p=g_pHead;//将头节点的信息备份给节点p while(p->pNext!=NULL)//当头节点的指向下一个的地址部分不为空 {if(p->pNext->stu.stuNum==nStuNum)//头节点的指向下一个的地址部分跳转的节点里面的学号信息与要删除的信息相同 {p2=p->pNext;//要删除的节点是节点p2 p->pNext=p->pNext->pNext;//将节点p的指向下一个的地址部分指向删除节点的下一个 free(p2);printf("删除成功!\n");system("pause"); //系统暂停system("cls");//系统清屏 return;}p=p->pNext;//如果要删除的节点是尾节点, if(p->pNext ==NULL){break;}}if(p->pNext==NULL){printf("没有找到该学员的信息!\n");system("pause"); //系统暂停system("cls");//系统清屏 }}

.h文件源码:

#include <stdio.h>#include <conio.h>// 使用该语句【char ch=getch(); 从键盘接收一个字符】时所添加的头文件 #include <stdlib.h>// 向内存申请空间【malloc(sizeof(Node));】的时候要用到的头文件 #include <string.h>//使用该语句【memcpy(pNewNode,&stu,sizeof(Student));】时所添加的头文件 //定义一个学生typedef struct _Student {char name[20];//姓名 int stuNum;//学号 int age;//年龄 int score;//总评成绩 } Student; //创建一个_student结构体类型的定义并且取别名为Student // 节点(车厢)typedef struct _Node{Student stu;// 链表中"车厢 "存放了学生的相关信息struct _Node* pNext;// 以及指向下一个节点的指针 } Node;// 定义一个头节点Node *g_pHead = NULL; //注意是NULL不要打错,不然会报错//学生管理系统界面入口void Welcome_entrance(); // 函数声明 带() 带结束标志; //1.录入学生信息void InputStudentInfo();//2.打印学生信息void PrintStudntInfo();//3.保存学生信息void SaveStudentInfo();//4.读取原有学生信息void ReadStudentInfo();//5.统计所有学生人数void CountStudent();//6.查找学生信息Node* FindStudent();//7.修改学生信息void ModifyStudent();//8.删除学生信息void DeleteStudent();

第一次跟写出现的一些问题

不知道用Dev C++如何创建头文件

解决:devc++建立头文件步骤-百度经验 ()

水平制表符 \t 类似Tab键 相当于8个空格

死循环可以直接写 while(1){~~~};

函数声明以及函数体的区别:

函数声明:

函数体:

函数调用:

接收用户的字符的语句有三种:

用switch语句时候你的格式是错误的,请查看正确的格式:

不会定义结构体,请看正确格式:(不要忘记char类型后面需要带上大小,但是int不用)

不会创建结构体–组成链表的元素的创建:

链表示意图:

忘记在主文件那里加入头文件

#include "StudentManageSystem.h"

struct结构体打错了,少打了一个r

NULL 没有打对,打了Null,所以报错出现了该错误,但其实只要把所有改成对的NULL

-

Student打错了一直没有找到,浪费时间了

报错ld returned 1 exit status

记住是==号,否则只会删除第一列数据 ,由于少打了一个=号导致结果错误

运行成功截图

录入学生信息成功

打印学生信息成功

保存学生信息成功

读取原有学生信息成功

统计所有学生人数成功

查找学生信息成功

修改学生信息成功

删除学生信息成功

退出系统成功

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。