码农生涯第一个项目————彩票管理系统(C语言Linux)<1.
学习一个月c语言后所接触的第一个项目,用ubuntu系统自带的vim编写的。作为之前只用过windows图形界面的小白,使用linux操作系统还是略显生疏,不过在编写过一个相对完整的项目后,对终端的操作也变得驾轻就熟。
以下是项目的一些基本要求:
系统功能示例
需求:
1. 对用户的管理:
对用户链表的增、删、改、查。
用户能够注册、登陆、充值、查看个人信息、注销
2. 对发行记录的管理:
对发行记录链表的增、查。
管理员能够发行彩票、查询发行的记录
3. 对购买记录的管理:
对购买记录链表的增、查。
用户能够添加购买记录、查看购买记录
为了养成良好习惯,尽管项目相对简单,我仍然建立了工程目录及makefile文件。
![](https://img.haomeiwen.com/i14105978/8c789a299bf01c03.png)
链表设立
首先确定了需要建立三条链表 分别储存用户信息、彩票购买记录、发行的彩票信息。
三个结构体的定义:
![](https://img.haomeiwen.com/i14105978/18f1135bacf7e4b5.png)
![](https://img.haomeiwen.com/i14105978/68b6aec43f4215ad.png)
链表结构体的定义
我编写了一条 双向循环的通用链表 通过传入三个结构体生成了三条链表来保存数据。
![](https://img.haomeiwen.com/i14105978/53262ca56b473eca.png)
其中 void* data 来指向所保存的数据,因为数据均为结构体故在内存空间是连续的,int size 表示这段数据的大小。通过不确定类型的指针void* 和 长度 可以储存不同类型的结构体。
通用链表的功能实现
注释解析: // 功能 / 传入参数 / 返回值
![](https://img.haomeiwen.com/i14105978/e456d01dafc48498.png)
通过需要保存的结构体大小size,来创建一条新的链表。将size的值传入链表,为以后添加节点做准备。
![](https://img.haomeiwen.com/i14105978/2b529fda47dc3d98.png)
添加节点的函数中调用了两次calloc,分别为节点和值域在堆上申请了空间。
由于是双向循环 我这里使用了尾插法 要注意这里节点链接指针的赋值顺序。30~34的顺序不可更改。
![](https://img.haomeiwen.com/i14105978/df2201f79b867df7.png)
这里通过额外传入一个打印函数的指针来确定链表中数据的打印方式。
![](https://img.haomeiwen.com/i14105978/fe6264f0480f698e.png)
因为之前每个节点都调用了 两次calloc, 故释放的时候也需要调用两次free分别对节点指针 和 值域指针进行内存释放。
![](https://img.haomeiwen.com/i14105978/d3ea2f785c428804.png)
相对于一般链表这里需要 传入一个比较函数 来确定节点内部数据的比较方法。
![](https://img.haomeiwen.com/i14105978/362f6a946eafeb8c.png)
删除与查找类似 依赖于传入的比较函数,还有不能忘记对77,78行对链接指针的修改。
![](https://img.haomeiwen.com/i14105978/a17d2ebce339da5c.png)
由于链表为双向循环的,因此使用快速排序的方法。而且相对于选择排序和冒泡排序,快速排序时间复杂度更低。
通过对链表内部的值域指针的交换,达到数据排序的目的。
![](https://img.haomeiwen.com/i14105978/42bf418ad5e039ee.png)
运用了c语言的文件读写,将链表中数据部分保存至 指定路径的 二进制文件。
![](https://img.haomeiwen.com/i14105978/b62f8ebc4d92d5af.png)
加载时注意退出时要释放未使用的空间。(124~129行)
![](https://img.haomeiwen.com/i14105978/1914262e0a8b42ec.png)
以上就是我针对该项目的链表建立。