C++学生信息管理系统(有头链表+文件存取)
C++数据结构:有头链表+文件存取操作
- 编译环境:vs2019;
- 注意事项:点个关注吧;
- 由于代码较多,不贴出完整代码,会挑出主要部分来叙述,我会将源文件上传CSDN,并在文末附上百度网盘链接,有需要可自行下载,若链接失效可评论获取;
- 建议:各位小伙伴在阅读的时候可以一个函数一个函数的阅读,方便理解;
- 注:文章仅作为自己成长的记录,不足之处还请多指教(师承大帅)。
运行截图:
项目分析
有头链表就是通过一个头部指针来操作整个的数据,然后又通过指针互相连接,串在一起;大家可以联想老鹰捉小鸡时,母鸡和小鸡排在一起用手拉着对方的情形;
有头链表也可参考下图:
结构体嵌套问题:
初始化数据域:
p_Node initNode()
{p_Node pN = (p_Node)malloc(sizeof(Node));if (!pN)exit(OVERFLOW);//exit(OVERFLOW)是强行退出程序//这里就是如果指针内存分配失败,强行退出程序pN->age = 0;pN->number = 0;//指针通过动态内存申请可变为变量,SIZE是我定义的宏pN->name = (char*)malloc(sizeof(char) * SIZE);if (!pN->name)exit(OVERFLOW);return pN;
}
初始化指针域:
p_Data createHead()
{p_Data p_Head = (p_Data)malloc(sizeof(Data));if (!p_Head)exit(OVERFLOW);p_Head->next = NULL;return p_Head;
}
将节点变为数据:
p_Data createData(p_Node Node)
{p_Data p_NewData = (p_Data)malloc(sizeof(Data));if (!p_NewData)exit(OVERFLOW);p_NewData->next = NULL;p_NewData->node = initNode();//字符串不能直接赋值,要进行拷贝int strLeng = strlen(Node->name) + 1;//strlen计算的长度中没有算'/0',终止符,所以要加1;strcpy_s(p_NewData->node->name, strLeng, Node->name);p_NewData->node->age = Node->age;p_NewData->node->number = Node->number;return p_NewData;
}
保存函数
- 文件写操作的一般步骤(读和写步骤一样):
- 创建写文件流对象 ->打开文件 -> 判断文件是否打开 -> 写入文件 -> 关闭文件;
- 这里 ios::app 是以追加的方式写文件,否则会覆盖原有文件;
int saveFile(p_Data p_Head)
{ofstream ofs;ofs.open(FILENAME, ios::binary | ios::out | ios::app);if (!ofs.is_open()){cout << "保存文件时,打开文件失败..." << endl;return Error;}p_Data pMove = p_Head->next;if (pMove == NULL){cout << "未保存,链表没有数据..." << endl;ofs.close();return Error;}while (pMove != NULL){ofs << pMove->node->name<<" "<< pMove->node->age<<" "<< pMove->node->number << endl;pMove = pMove->next;}ofs.close();cout << "保存成功..." << endl;return Ok;
}
读取文件:
int readFile(p_Data p_Head)
{p_Data curData = p_Head->next;if (curData != NULL){free(curData);curData = NULL;}p_Head->next = NULL;//至于上面这里这样写的作用,大家可以注释后感受一下//注释快捷键(vs2019中):ctrl+k+cifstream ifs;ifs.open(FILENAME, ios::binary | ios::in);if (!ifs.is_open()){cout << "读文件时打开失败..." << endl;return Error;}p_Node Node = initNode();//int num = 0;调试作用while (ifs >> Node->name >> Node->age >> Node->number){insertHead(p_Head, Node);//num++;调试作用}//这里是我调试的时候写的/*cout << "循环了" << num << "次" << endl;cout << "文件读取完毕..." << endl;*/ifs.close();cout << "成功读入文件..." << endl;return Ok;
}
判断输入类型
- 因为用户选择功能的方式是输入Int类型的数字,如果不对用户的输入做判断,当用户char类型或其他类型数据时,系统会崩掉或者陷入无线循环,所以最好判断一下输入;
- cin.fail()判断输入的类型和定义的类型是否一致,一致返回true,否则返回false;
int select;
cin >> select;
if (!cin.fail())
遇到的问题:
- 文件在读取时数据不正确;
- 读取的结点数据未能正确保存;
产生原因
- 结构体赋值时只是进行了简单的赋值操作;
- 指针指向不明确,出现了野指针;
- 错误代码1:
p_Data createData(p_Node Node)
{p_Data p_NewData = (p_Data)malloc(sizeof(Data));if (!p_NewData)exit(OVERFLOW);p_NewData->next = NULL;p_NewData->node = Node;return p_NewData;
}
- 改正1
p_Data createData(p_Node Node)
{p_Data p_NewData = (p_Data)malloc(sizeof(Data));if (!p_NewData)exit(OVERFLOW);p_NewData->next = NULL;p_NewData->node = initNode();int strLeng = strlen(Node->name) + 1;strcpy_s(p_NewData->node->name, strLeng, Node->name);p_NewData->node->age = Node->age;p_NewData->node->number = Node->number;return p_NewData;
}
- 错误代码2
//readFile()函数中的代码
p_Data curData = p_Head->next;if (curData != NULL){free(curData);curData = NULL;}
- 改正2:
p_Data curData = p_Head->next;if (curData != NULL){free(curData);curData = NULL;}p_Head->next = NULL;
结语:
- 如果本文对小伙伴有帮助,还望点个关注,我会推出更多优质文章的;
- 关于该项目的主要几点和内容分析我就分析到这儿,如有疑问可私信或评论讨论,不足之处还请各位大佬指教,最后附上项目的网盘链接(嫌弃下载慢的可在我上传的资源中下载):https://pan.baidu.com/s/1SlIiR0ih_DNI9fzDy0aLng 提取码:260y
C++学生信息管理系统(有头链表+文件存取)相关推荐
- 学生信息管理系统(头哥适用版)(c语言)
Reborn Terran Emperor 由于最新pat不支持gets的使用,现在有两个解决思路 1.利用fgets,但fgets会保留换行符,需要对字符串修改,极其麻烦,不推荐 2.引入c++的c ...
- 双链表嵌套的简单学生信息管理系统
参考:实现双链表嵌套的简单学生信息管理 作者:三速何时sub20 发布时间: 2020-07-20 10:44:40 网址:https://blog.csdn.net/weixin_44234294/ ...
- c语言文件读写_学生信息管理系统(C语言\单向链表\文件读写)
最近在复习数据结构,早上刚复习完链表,就想到了学生信息管理系统这个经典的大作业,然后呢,花了一早上加一中午的功夫给重新实现了一遍,里面可能会有写的不好的地方,但也代表了我实现的一些想法,在这里我将分享 ...
- 学生信息管理系统C语言单链表文件实现
功能概述:分有教师端和学生端 1.录入学生信息 2.排列学生信息 3.修改学生信息 4.删除学生信息 5.查找学生信息 6.修改系统密码 7.获取 ...
- C语言版-学生信息管理系统(链表实现)
#include<stdio.h> #include<stdlib.h> #include<string.h> #define M 2 #define N 4 ty ...
- c语言饭卡管理系统链表文件,C语言《学生信息管理系统》链表+文件操作
今天带来的是一个链表版本的<学生信息管理系统>,功能包括:添加.显示.查询.删除.保存.读取,等功能模块,链表是C语言的进阶内容,希望大家好好学习,这里的代码可能会有一些瑕疵,希望大家提供 ...
- C语言链表实现学生信息管理系统
大一做的这个程序,主要是链表的增删查改操作.很好理解,源码如下,可以直接运行 #include<stdio.h> #include<stdlib.h> #include< ...
- c语言程序设计学生程序查询,《c语言程序设计报告-学生信息管理系统》.doc
<c语言程序设计报告-学生信息管理系统> 中南大学 ? ? C语言程序设计实践报告 ? ? ? ? ? 题 目 学生信息管理系统 学生姓名 张眼 指导教师 刘伟荣 学 院 信息科学与工程学 ...
- c语言编辑学生信息录入的程序,c语言编的学生信息管理系统小程序!!有不足的请指出,谢谢!!...
c语言编的学生信息管理系统小程序!!有不足的请指出,谢谢!! #include #include #include struct st { char name[20]; int english; in ...
最新文章
- html5+原生js画的瀑布,果然程序员不适合做设计吗?
- 14nm芯片技术突破 中国集电关键装备实现从无到有
- 苹果更新未知错误17_iOS 13 新功能,静音未知来电
- YUV格式学习:YUYV、YVYU、UYVY、VYUY格式转换成RGB24
- Session自定义存储及分布式存储
- 【复习笔记】Cache的映像方法
- C/C++[codeup 1942]进制转换
- 读书笔记:普林斯顿微积分读本
- 制造业ERP系统具体操作流程是什么?
- 电脑wps可以语音录入吗_WPS怎么样?语音速记助你1分钟输入400字
- JQAjax读页面里面的方法
- python实现GCD算法
- MacOSx打包dmg文件(带背景图片)
- API集成测试问题2:Expected status code 200 but received 500. Failed asserting that false is true.
- Canvas响应 -岛岛还存活在代码的第79天-
- python怎么输出所有奇数_python输出100以内奇数的几种输出方式-Go语言中文社区
- Access根据出生日期计算年龄_小技巧 | 在SPSS中根据出生日期计算年龄
- 在SAR-Opt数据融合领域针对深度学习的SEN1-2数据集
- leetcode13——步长k的差值小于t的元素组,包含1的正方形面积,完全二叉树的结点个数,矩形重叠面积,汇总区间
- excel数据可视化销售报表案例--根据某平台提供的明细数据及需求制作的一份销售报表案例