> # ♻️ 资源
> **大小:** 15.1MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010429**](https://www.yuque.com/sxbn/ks/100010429)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87388344**](https://download.csdn.net/download/s1t16/87388344)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 基于C语言实现一个社交系统
# 设计过程
## 设计构想
Project 的基本要求是实现一个社交系统,使其能够进行基本的消息发布,信息共享,好友关注等功能。针对后台的操作,希望设计针对用户名的开放链表法的哈希索引,消息则使用链表实现,关注关系以有向图的十字链表存储。至于前台的设计,希望以一个界面类,实现全部的前台指令操作。在设计的时候,应当以功能为导向,为界面类提供应有的接口,以保证代码的正常运作。
文件存储的设想:
- 尽可能减少内存的使用量,使用文件操作
- 修改用户信息不需要修改索引值,以达到代码量的减少
- 多索引,保证条件搜索的速度
- 可变信息与长度不可变的信息分开存储,以实现叠加式地文件内容增长,而非重写
数据结构的设想:
- 尽可能实现不修改索引的情况下实现数据文件的修改
- 尽可能选用合适的数据结构,不同情况下使用的数据结构考虑实现为模板方式
对于程序的设想就是这样,在写程序的时候也一直尽量以之作为纲领。
## 文件存储
因为要保证用户的信息在程序结束后不消失,所以需要将其保存在文件中。我将用户的所有内容分为三类:长度不变的个人信息(如电话,等等),用户发布的信息,以及关注信息。所有的文件都是以二进制存储。用户的所有关于个人的信息都存储在 info 中,用户发布的,消息在 meg 中,而关注在 like 中。他们的组织形式如 Figure 1 所示。
![5d900765a711080df492147e438dd91d.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711417173034-87c422bf-03e5-413f-888d-07fd7d98089d.png#averageHue=%23fcfcf8&clientId=ue73f357e-262b-4&from=paste&height=406&id=u705833ce&originHeight=508&originWidth=877&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=46548&status=done&style=none&taskId=ue168717a-8f95-4ac3-a2c9-2a352ef0622&title=&width=701.6)
还有关于索引的存储,由于程序要求实现关于个人信息的各个条目的搜索,所以关于每一种信息的索引都单独存放。index 中存放的是用户名哈希索引,index_name 存放的是用户姓名索引,index_bir 是生日索引,index_tele 是电话索引,index_add 是地址索引。
## 前台设计
程序的前台功能都是在 Interface 类中实现的,Interface 同时也是连结前台后台的主要类。同时为了测试模式,Interface 也提供了测试接口。详细接口如图 Figure 2,具体见。
![83ce380a35f1dffe837a29186fb9eb26.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711417193131-7a889559-f831-4636-bdc9-f3f5dbc179c0.png#averageHue=%23f7f1dd&clientId=ue73f357e-262b-4&from=paste&height=1394&id=ube0a9b23&originHeight=1743&originWidth=785&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=340414&status=done&style=none&taskId=uf086600d-36c8-4b92-9b67-67394ef2e9c&title=&width=628)
## 数据结构
### 前台-字典树
本来是打算实现前缀搜索的功能的,后因时间紧迫,无奈放弃。不过在字典序输出关注列表时可以用到字典树,因此就保留了此数据结构。
在整个程序中,只有在前台显示列表的时候使用到了该数据结构,所以用处不是很大,就作为一个尝试吧。
### 后台-哈希表(模板实现)
在程序的后台操作中,出于各种考虑,最终选择了链表寻址式哈希表作为索引的数据结构。主要的信息都是以字符串的方式存储,因此哈希的函数是针对字符串设计的,采用了 BKDRHash 方法,哈希表共有 H 项,H 为宏定义,大小可改动,解决冲突的方法是拓展链表法。考虑到系统要求的查找操作不只针对用户名,因此哈希表以模板类的方式实现,接口如 Figure 3 所示,详细接口见。
![affeec6e2ac61423d2489488b882506f.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711417211860-ad9db4d3-e6ba-41f9-b503-351b48dc2aa1.png#averageHue=%23f7f1db&clientId=ue73f357e-262b-4&from=paste&height=469&id=u469ddbc4&originHeight=586&originWidth=549&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=53145&status=done&style=none&taskId=u5044cdce-5ecf-409a-8df4-aebd3db3fa0&title=&width=439.2)
数据结构在第一次启动时,会建立哈希表项的空内容,之后会在索引文件中插入新的内容,在加入元素的时候会将其保存至硬盘中,以保证内存与硬盘内容的统一。在程序运行的过程中,数据结构始终不会被读入内存,索引项的寻址等操作大部分都是建立在文件操作的基础上。由于在实现的设想中,修改都是在数据文件中进行,而哈希索引只是存放指向数据文件的指针,因此是不会被修改,因此没有实现关于索引修改的接口,而对于信息修改导致的修改,采取的是先删除再插入的方法。
![a716becae8d1458b756a89b2baeda7a9.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711417224875-a16fde2a-f454-44ba-b9f0-f42483e86524.png#averageHue=%23f9f3df&clientId=ue73f357e-262b-4&from=paste&height=366&id=uf542657b&originHeight=457&originWidth=645&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=36932&status=done&style=none&taskId=u878d325a-2cfb-46c7-8bcf-7778ae66e4b&title=&width=516)
索引的格式如下所示,key 值是索引值,而 pointer 则指向索引值所在文件的位置,是一个文件指针。只要知道索引的键值,可以将其在文件中的位置找到,如果保证索引与数据的同步性,就可以大大提高遍历的效率,这也是本次 project 最有难度的地方吧。
| Key1 | Pointer1 |
| --- | --- |
| Key2 | Pointer2 |
| … | … |
至于存储格式的设置,首先索引是有其键值以及指向 info 中对应信息所在位置的指针,而存储还需要保存一个指向下一个哈希索引节点的指针。即如下所示,Saveform 是由索引和指针构成,指针指向链表的下一个节点,依靠此建立了哈希链表。
| RecordNode1 | PointerToNext1 |
| --- | --- |
| RecordNode2 | PointerToNext2 |
| … | … |
在每次插入新索引时,原本链表的最后一个节点会将 PointerToNext 指向新建立的索引结点,从而形成新的索引。这样就完完全全在文件中构建起了一个链表拓展法的哈希索引,提高了搜索的效率。
### 后台-有向图十字链表
程序要求可以查看用户的关注以及关注用户的用户,因此选用有向图作为存储关注关系的数据结构,而十字链表是比较好的存储方式,因为其可以以链表的方式同时查看用户的关注以及关注用户的用户。该有向图也是常驻硬盘的。接口如图 Figure 5 所示,详细见。
![fd843062d2a8cfe8713b4d8909addb65.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711417252073-b845b87d-543b-4eb3-957b-c6eb5db9b354.png#averageHue=%23faf3dd&clientId=ue73f357e-262b-4&from=paste&height=869&id=u57fa15e1&originHeight=1086&originWidth=616&originalType=bi
没有合适的资源?快使用搜索试试~ 我知道了~
基于C语言实现一个社交系统【100010429】
共343个文件
h:117个
cpp:74个
tlog:21个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 201 浏览量
2023-01-16
17:11:21
上传
评论
收藏 15.11MB ZIP 举报
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010429 Project 的基本要求是实现一个社交系统,使其能够进行基本的消息发布,信息共享,好友关注等功能。针对后台的操作,希望设计针对用户名的开放链表法的哈希索引,消息则使用链表实现,关注关系以有向图的十字链表存储。至于前台的设计,希望以一个界面类,实现全部的前台指令操作。在设计的时候,应当以功能为导向,为界面类提供应有的接口,以保证代码的正常运作。
资源推荐
资源详情
资源评论
收起资源包目录
基于C语言实现一个社交系统【100010429】 (343个子文件)
interface.cpp 56KB
interface.cpp 52KB
interface.cpp 51KB
interface.cpp 49KB
interface.cpp 48KB
interface.cpp 35KB
interface.cpp 23KB
interface.cpp 20KB
interface.cpp 20KB
interface.cpp 14KB
BTree.cpp 13KB
BTree.cpp 13KB
BTree.cpp 13KB
BTree.cpp 13KB
BTree.cpp 13KB
BTree.cpp 13KB
BTree.cpp 13KB
BTree.cpp 13KB
interface.cpp 11KB
graph.cpp 7KB
graph.cpp 7KB
graph.cpp 7KB
graph.cpp 7KB
graph.cpp 7KB
program.cpp 6KB
program.cpp 5KB
graph.cpp 5KB
graph.cpp 5KB
graph.cpp 5KB
graph.cpp 5KB
graph.cpp 5KB
graph.cpp 5KB
program.cpp 4KB
program.cpp 4KB
program.cpp 4KB
hash.cpp 3KB
hash.cpp 3KB
hash.cpp 3KB
hash.cpp 3KB
hash.cpp 3KB
program.cpp 2KB
trie.cpp 2KB
trie.cpp 2KB
trie.cpp 2KB
program.cpp 2KB
program.cpp 2KB
program.cpp 2KB
trie.cpp 2KB
message.cpp 1KB
message.cpp 1KB
message.cpp 1KB
message.cpp 1KB
message.cpp 1KB
message.cpp 1KB
hash.cpp 1024B
BTreeNode.cpp 317B
BTreeNode.cpp 317B
BTreeNode.cpp 317B
BTreeNode.cpp 317B
BTreeNode.cpp 317B
BTreeNode.cpp 317B
BTreeNode.cpp 317B
BTreeNode.cpp 317B
main.cpp 174B
main.cpp 172B
main.cpp 165B
main.cpp 165B
main.cpp 165B
main.cpp 165B
main.cpp 165B
main.cpp 165B
main.cpp 165B
main.cpp 165B
main.cpp 154B
Project设计与测试文档.docx 1.46MB
~$设计文档.docx 162B
P2Project.vcxproj.filters 2KB
P2Project.vcxproj.filters 2KB
P2Project.vcxproj.filters 2KB
P2Project.vcxproj.filters 2KB
P2Project.vcxproj.filters 2KB
P2Project.vcxproj.filters 2KB
P2Project.vcxproj.filters 2KB
P2Project.vcxproj.filters 2KB
P2Project.vcxproj.filters 2KB
BTree.h 9KB
BTree.h 9KB
BTree.h 9KB
BTree.h 9KB
BTree.h 9KB
BTree.h 9KB
BTree.h 9KB
BTree.h 9KB
hash.h 7KB
hash.h 7KB
hash.h 7KB
hash.h 7KB
hash.h 7KB
hash.h 5KB
interface.h 2KB
共 343 条
- 1
- 2
- 3
- 4
资源评论
神仙别闹
- 粉丝: 2668
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功