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++学生信息管理系统(有头链表+文件存取)相关推荐

  1. 学生信息管理系统(头哥适用版)(c语言)

    Reborn Terran Emperor 由于最新pat不支持gets的使用,现在有两个解决思路 1.利用fgets,但fgets会保留换行符,需要对字符串修改,极其麻烦,不推荐 2.引入c++的c ...

  2. 双链表嵌套的简单学生信息管理系统

    参考:实现双链表嵌套的简单学生信息管理 作者:三速何时sub20 发布时间: 2020-07-20 10:44:40 网址:https://blog.csdn.net/weixin_44234294/ ...

  3. c语言文件读写_学生信息管理系统(C语言\单向链表\文件读写)

    最近在复习数据结构,早上刚复习完链表,就想到了学生信息管理系统这个经典的大作业,然后呢,花了一早上加一中午的功夫给重新实现了一遍,里面可能会有写的不好的地方,但也代表了我实现的一些想法,在这里我将分享 ...

  4. 学生信息管理系统C语言单链表文件实现

    功能概述:分有教师端和学生端 1.录入学生信息     2.排列学生信息    3.修改学生信息     4.删除学生信息       5.查找学生信息     6.修改系统密码       7.获取 ...

  5. C语言版-学生信息管理系统(链表实现)

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define M 2 #define N 4 ty ...

  6. c语言饭卡管理系统链表文件,C语言《学生信息管理系统》链表+文件操作

    今天带来的是一个链表版本的<学生信息管理系统>,功能包括:添加.显示.查询.删除.保存.读取,等功能模块,链表是C语言的进阶内容,希望大家好好学习,这里的代码可能会有一些瑕疵,希望大家提供 ...

  7. C语言链表实现学生信息管理系统

    大一做的这个程序,主要是链表的增删查改操作.很好理解,源码如下,可以直接运行 #include<stdio.h> #include<stdlib.h> #include< ...

  8. c语言程序设计学生程序查询,《c语言程序设计报告-学生信息管理系统》.doc

    <c语言程序设计报告-学生信息管理系统> 中南大学 ? ? C语言程序设计实践报告 ? ? ? ? ? 题 目 学生信息管理系统 学生姓名 张眼 指导教师 刘伟荣 学 院 信息科学与工程学 ...

  9. c语言编辑学生信息录入的程序,c语言编的学生信息管理系统小程序!!有不足的请指出,谢谢!!...

    c语言编的学生信息管理系统小程序!!有不足的请指出,谢谢!! #include #include #include struct st { char name[20]; int english; in ...

最新文章

  1. html5+原生js画的瀑布,果然程序员不适合做设计吗?
  2. 14nm芯片技术突破 中国集电关键装备实现从无到有
  3. 苹果更新未知错误17_iOS 13 新功能,静音未知来电
  4. YUV格式学习:YUYV、YVYU、UYVY、VYUY格式转换成RGB24
  5. Session自定义存储及分布式存储
  6. 【复习笔记】Cache的映像方法
  7. C/C++[codeup 1942]进制转换
  8. 读书笔记:普林斯顿微积分读本
  9. 制造业ERP系统具体操作流程是什么?
  10. 电脑wps可以语音录入吗_WPS怎么样?语音速记助你1分钟输入400字
  11. JQAjax读页面里面的方法
  12. python实现GCD算法
  13. MacOSx打包dmg文件(带背景图片)
  14. API集成测试问题2:Expected status code 200 but received 500. Failed asserting that false is true.
  15. Canvas响应 -岛岛还存活在代码的第79天-
  16. python怎么输出所有奇数_python输出100以内奇数的几种输出方式-Go语言中文社区
  17. Access根据出生日期计算年龄_小技巧 | 在SPSS中根据出生日期计算年龄
  18. 在SAR-Opt数据融合领域针对深度学习的SEN1-2数据集
  19. leetcode13——步长k的差值小于t的元素组,包含1的正方形面积,完全二叉树的结点个数,矩形重叠面积,汇总区间
  20. excel数据可视化销售报表案例--根据某平台提供的明细数据及需求制作的一份销售报表案例

热门文章

  1. 百度文库随便下载,不借用任何插件
  2. 分布式:分布式系统设计策略。
  3. Control-Freec:检测拷贝数变异的神器
  4. java代码如何运行?
  5. Ajax与分页的实现
  6. WORD排版-目录管理/标题排版
  7. web页面中实现局部页面的刷新
  8. 将2到10这9个自然数填入图中9个圆圈中,每个数只能用一次,且使每一条直线上的三个数的和相同,则中间圆圈的数是(),对应的每一条直线上的三个数的和是()
  9. 【转】ST、SC、FC、LC光纤接头区别
  10. 必过SafetyNet!以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法