当前位置: 首页 > news >正文

社交网络模拟

1. 引言

在计算机科学的学习中,数据结构与算法的实践应用至关重要。本文将详细介绍一个使用C语言实现的简单社交网络系统,该系统支持用户管理、好友关系建立与维护、共同好友查找以及好友推荐等功能。通过这个项目,我们可以深入理解数组、结构体、字符串处理等C语言核心概念的实际应用。

2. 系统设计概述

2.1 数据结构设计

系统采用以下核心数据结构:

#define MAX_USER06 100 #define MAX_NAME06 20 #define MAX_FRIENDS06 50 // 用户结构体 typedef struct { char username[MAX_NAME06]; // 用户名 char friends[MAX_FRIENDS06][MAX_NAME06]; // 好友列表 int friendCount06; // 好友数量 } User06; // 社交网络图结构体 typedef struct { User06 users[MAX_USER06]; // 用户数组 int userCount06; // 当前用户总数 } SocialNetwork06;

2.2 系统功能模块

系统主要包含以下功能模块:

  1. 用户管理(创建、查找)
  2. 好友关系管理(添加、删除、查询)
  3. 社交分析(共同好友查找)
  4. 智能推荐(好友推荐)
  5. 数据持久化(文件加载)

3. 核心功能实现

3.1 用户管理功能

// 初始化社交网络 void initNetwork06(SocialNetwork06 *net) { net->userCount06 = 0; } // 查找用户下标 int findUser06(SocialNetwork06 *net, const char *name) { for (int i = 0; i < net->userCount06; i++) { if (strcmp(net->users[i].username, name) == 0) { return i; } } return -1; } // 创建新用户 int createUser06(SocialNetwork06 *net, const char *name) { if (findUser06(net, name) != -1) return 1; strcpy(net->users[net->userCount06].username, name); net->users[net->userCount06].friendCount06 = 0; net->userCount06++; return 0; }

3.2 好友关系管理

// 判断是否是好友 int isFriend06(User06 *user, const char *name) { for (int i = 0; i < user->friendCount06; i++) { if (strcmp(user->friends[i], name) == 0) { return 1; } } return 0; } // 添加好友 void addFriend06(SocialNetwork06 *net, const char *name1, const char *name2) { if (strcmp(name1, name2) == 0) { printf("错误:不能添加自己为好友!\n"); return; } createUser06(net, name1); createUser06(net, name2); int u1 = findUser06(net, name1); int u2 = findUser06(net, name2); if (isFriend06(&net->users[u1], name2)) { printf("已经是好友!\n"); return; } // 双向添加 strcpy(net->users[u1].friends[net->users[u1].friendCount06++], name2); strcpy(net->users[u2].friends[net->users[u2].friendCount06++], name1); printf("成功添加:%s %s\n", name1, name2); } // 删除好友 void deleteFriend06(SocialNetwork06 *net, const char *name1, const char *name2) { int u1 = findUser06(net, name1); int u2 = findUser06(net, name2); if (u1 == -1 || u2 == -1) { printf("用户不存在!\n"); return; } if (!isFriend06(&net->users[u1], name2)) { printf("不是好友!\n"); return; } // 删除 u1 中的 name2 for (int i = 0; i < net->users[u1].friendCount06; i++) { if (strcmp(net->users[u1].friends[i], name2) == 0) { for (int j = i; j < net->users[u1].friendCount06 - 1; j++) { strcpy(net->users[u1].friends[j], net->users[u1].friends[j + 1]); } net->users[u1].friendCount06--; break; } } // 删除 u2 中的 name1 for (int i = 0; i < net->users[u2].friendCount06; i++) { if (strcmp(net->users[u2].friends[i], name1) == 0) { for (int j = i; j < net->users[u2].friendCount06 - 1; j++) { strcpy(net->users[u2].friends[j], net->users[u2].friends[j + 1]); } net->users[u2].friendCount06--; break; } } printf("成功删除好友关系!\n"); }

3.3 社交分析功能

// 查看好友列表 void showFriendList06(SocialNetwork06 *net, const char *name) { int u = findUser06(net, name); if (u == -1) { printf("用户不存在!\n"); return; } printf("%s 的好友:\n", name); for (int i = 0; i < net->users[u].friendCount06; i++) { printf(" %d. %s\n", i + 1, net->users[u].friends[i]); } } // 查找共同好友 void findCommonFriends49(SocialNetwork06 *net49, const char *n149, const char *n249) { int u149 = findUser06(net49, n149); int u249 = findUser06(net49, n249); if (u149 == -1 || u249 == -1) { printf("用户不存在!\n"); return; } printf("共同好友:\n"); int found49 = 0; for (int i = 0; i < net49->users[u149].friendCount06; i++) { if (isFriend06(&net49->users[u249], net49->users[u149].friends[i])) { printf(" %s\n", net49->users[u149].friends[i]); found49 = 1; } } if (!found49) printf(" 无\n"); }

3.4 好友推荐算法

// 推荐好友 void recommendFriends49(SocialNetwork06 *net49, const char *name49) { int u49 = findUser06(net49, name49); if (u49 == -1) { printf("用户不存在!\n"); return; } char rec49[MAX_USER06][MAX_NAME06]; // 推荐好友列表 int recCnt49[MAX_USER06] = {0}; // 对应下标:存放【共同好友数量】 int total49 = 0; // 有效推荐人数 User06 *user49 = &net49->users[u49]; for (int i = 0; i < user49->friendCount06; i++) { char *fname49 = user49->friends[i]; // 第i个朋友的名字 int fu49 = findUser06(net49, fname49); // 这位好友在用户数组中的下标 // 遍历我好友的所有好友 for (int j = 0; j < net49->users[fu49].friendCount06; j++) { char *ff49 = net49->users[fu49].friends[j]; // 推荐好友候选人 if (strcmp(ff49, name49) == 0) continue; // 不能推荐自己给自己 if (isFriend06(user49, ff49)) continue; // 已经是我的好友,不需要推荐 int k; // 去已有的推荐列表里查找:这个人是否已经被记录过 for (k = 0; k < total49; k++) { if (strcmp(rec49[k], ff49) == 0) { recCnt49[k]++; // 增加共同好友计数 break; } } if (k == total49) { // 新候选人 strcpy(rec49[total49], ff49); recCnt49[total49] = 1; total49++; } } } // 输出推荐结果(按共同好友数量排序) printf("好友推荐(按共同好友数量排序):\n"); for (int i = 0; i < total49 - 1; i++) { for (int j = 0; j < total49 - i - 1; j++) { if (recCnt49[j] < recCnt49[j + 1]) { // 交换推荐好友 char tempName[MAX_NAME06]; strcpy(tempName, rec49[j]); strcpy(rec49[j], rec49[j + 1]); strcpy(rec49[j + 1], tempName); // 交换计数 int tempCnt = recCnt49[j]; recCnt49[j] = recCnt49[j + 1]; recCnt49[j + 1] = tempCnt; } } } for (int i = 0; i < total49; i++) { printf(" %d. %s(共同好友数:%d)\n", i + 1, rec49[i], recCnt49[i]); } if (total49 == 0) { printf(" 暂无推荐\n"); } }

4. 数据持久化

// 从文件 data1.txt 加载数据 void loadFromFile06(SocialNetwork06 *net) { FILE *fp = fopen("data1.txt", "r"); if (fp == NULL) { printf("无法打开文件!\n"); return; } char a[MAX_NAME06], b[MAX_NAME06]; int line = 0; while (fscanf(fp, "%s %s", a, b) != EOF) { addFriend06(net, a, b); line++; } fclose(fp); printf("成功加载 %d 条关系,用户数:%d\n", line, net->userCount06); }

5. 系统测试与使用示例

5.1 主函数示例

int main() { SocialNetwork06 network; initNetwork06(&network); // 从文件加载数据 loadFromFile06(&network); // 测试功能 printf("\n=== 测试好友列表 ===\n"); showFriendList06(&network, "Alice"); printf("\n=== 测试共同好友 ===\n"); findCommonFriends49(&network, "Alice", "Bob"); printf("\n=== 测试好友推荐 ===\n"); recommendFriends49(&network, "Alice"); printf("\n=== 测试添加好友 ===\n"); addFriend06(&network, "Alice", "Charlie"); printf("\n=== 测试删除好友 ===\n"); deleteFriend06(&network, "Alice", "Bob"); return 0; }

5.2 数据文件格式

data1.txt文件格式示例:

Alice Bob Bob Charlie Alice David Eve Frank

6. 技术要点分析

6.1 数据结构选择

  • 使用静态数组而非动态内存分配,简化内存管理
  • 二维字符数组存储好友列表,便于直接操作
  • 结构体封装用户信息,提高代码可读性

6.2 算法复杂度

  • 查找用户:O(n)
  • 判断好友关系:O(m),其中m为好友数量
  • 添加/删除好友:O(n + m)
  • 共同好友查找:O(m₁ × m₂)
  • 好友推荐:O(m × f),其中f为好友的好友数量

6.3 边界情况处理

  1. 重复用户创建检查
  2. 自我添加好友限制
  3. 重复好友关系检查
  4. 数组越界防护
  5. 文件操作错误处理

7. 扩展与优化建议

7.1 性能优化

  1. 使用哈希表加速用户查找
  2. 引入好友关系缓存机制
  3. 实现增量式好友推荐计算

7.2 功能扩展

  1. 添加用户分组功能
  2. 实现消息系统
  3. 支持好友关系权重
  4. 添加社交图谱可视化

7.3 代码改进

  1. 使用动态内存分配支持更多用户
  2. 添加错误码枚举提高可维护性
  3. 实现模块化设计,分离界面与逻辑

8. 总结

本文实现了一个完整的C语言社交网络系统,涵盖了用户管理、好友关系操作、社交分析等核心功能。通过这个项目,我们不仅掌握了C语言中结构体、数组、字符串处理等基础知识的应用,还学习了如何设计实用的数据结构和算法来解决实际问题。

该系统的设计思路清晰,代码结构合理,适合作为C语言学习者的实践项目。读者可以根据自己的需求进一步扩展功能,如添加图形界面、网络通信支持等,将其发展为更完善的社交网络应用。

http://www.zskr.cn/news/1498979.html

相关文章:

  • STM51单片机学习(三)
  • 计算机毕业设计之django基于大数据的天水师范学院在线选修课教育平台设计与实现
  • 【IEEE出版·深圳】2026年计算机感知与神经网络国际学术会议(CPNN 2026)
  • 6 月 2 日消息,小米今日正式公布了 MiMo 大模型,送邀请码一起来体验下牛皮不牛皮!
  • 2026年6月四川吸音板/隔音材料/吸音材料/装饰材料/声学材料厂家解析,认准成都澳登建材有限公司 - 2026年企业资讯
  • 辐射发射超标,磁环套了一个又一个还是压不住
  • 一个消息回调的设计哲学:论个人微信 API 的 Webhook 钩子怎么用才不踩坑
  • 美妆包装设计实战复盘:基于符号化与系列化思维打造差异化视觉体系
  • 【多模态大模型面经】Transformer专题面经
  • 微信小程序计算机毕设之基于springboot+微信小程序的问卷调查管理系统小程序基于微信小程序的调查问卷管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 实验室CMA/CNAS认证过程中,授权签字人的签字权限如何确定与管理?
  • 创业多年悟透:普通人的底气,从来不是暴富,是稳稳的坚持
  • 企业新媒体矩阵规模化后的治理结构与数据能力研究(2026)
  • 估值3500亿!DeepSeek融资后两手抓:算力基建与上层应用剑指何方?
  • 深度学习入门到实战
  • 新能源车企如何用AI大模型自救?RAG/Agent/Text-to-SQL三场景实战
  • 小程序毕设项目:基于springboot+微信小程序的问卷调查管理系统小程序 (源码+文档,讲解、调试运行,定制等)
  • 【218期】海康摄像头一键巡检工具
  • 传统路灯系统为何急需升级?三遥路灯控制器破解管控与能耗难题
  • 透视畸变克星:远心镜头核心技术全解析
  • 2026年AGV舵轮常用配型方式有哪些?一文讲清五大主流方案
  • 航空复合材料人工智能AI选材与结构优化大模型系统平台软件
  • 14、【AI基础知识入门】大语言模型概述
  • 企业如何免费调用1688基础API?每日限额与QPS限制详解(附Python源码)
  • Adams/Car整车建模技巧,麦弗逊悬架基础KC模型搭建
  • ABAQUS卵石混凝土细观模型立方体试件单轴受压破坏模拟
  • WGS84/GCJ02/BD09坐标系区别与在线转换方法(附免费工具)
  • 宁波万奢奢侈品回收靠谱吗?品牌实力、服务体系、真实案例全维度深度解析 - 资讯速览
  • 2026年武汉机器人与人工智能展览会倒计时!AI与机械碰撞出未来图景
  • 高考后第一台电脑怎么选?618期间5款学生游戏本性价比指南