如何遍历点赞用户列表实现帖子点赞逻辑?C语言技术问询
C语言帖子点赞功能:结构体设计与遍历实现
一、两种结构体方案优劣对比
- 方案1(动态数组存储点赞者)
- 核心设计:用
user** likers作为动态数组存储点赞用户指针 - 优点:支持随机访问,遍历速度略快
- 缺点:需要手动管理数组容量(扩容、缩容),删除点赞者时需移动元素,实现复杂度高,内存利用率低(点赞数波动大时易浪费空间)
- 核心设计:用
- 方案2(嵌套链表存储点赞者)
- 核心设计:每个帖子维护一个点赞者单链表,链表节点存储点赞用户信息
- 优点:增删操作简单(头插/头删O(1)),无需提前分配空间,内存利用率高,适配点赞数不确定的场景
- 缺点:遍历需逐个节点访问,但实际场景中点赞数不会过大,性能影响可忽略
结论:优先选择方案2,实现更简洁灵活,适配大多数场景
二、方案2的遍历与点赞逻辑实现
首先修正方案2中结构体的typedef顺序错误(必须先定义/typedeflikers再在message中使用),并优化结构体设计(推荐存储用户指针而非用户名,避免同名冲突且效率更高):
// 提前声明用户结构体 typedef struct user user; // 点赞者链表节点 typedef struct likers likers; struct likers{ user* likerUser; // 直接存储用户指针,高效且唯一 likers* next; }; // 用户结构体 struct user{ char* userName; char* password; user* next; }; // 帖子结构体 typedef struct message message; struct message{ char* content; user* owner; int likes; int postID; message* next; likers* likersHead; // 点赞者链表头节点 };
完整的点赞函数实现(含遍历检查)
#include <stdio.h> #include <stdlib.h> #include <string.h> // 这里插入上面修正后的结构体定义 int postLiking(user* owner, user* liker, int postID, message* dummyMessage){ // 1. 查找目标帖子 message* targetPost = NULL; message* currentMsg = dummyMessage; while(currentMsg != NULL){ if(currentMsg->owner == owner && currentMsg->postID == postID){ targetPost = currentMsg; break; } currentMsg = currentMsg->next; } if(targetPost == NULL){ printf("该用户没有ID为%d的帖子\n", postID); return 0; } // 2. 遍历点赞者链表,检查是否已点赞 likers* currentLiker = targetPost->likersHead; while(currentLiker != NULL){ // 直接对比用户指针,高效且避免用户名重复问题 if(currentLiker->likerUser == liker){ printf("你已经给这个帖子点过赞了\n"); return 0; } currentLiker = currentLiker->next; } // 3. 未点赞则添加到链表,点赞数+1 likers* newLiker = (likers*)malloc(sizeof(likers)); if(newLiker == NULL){ perror("内存分配失败"); return 0; } newLiker->likerUser = liker; newLiker->next = targetPost->likersHead; // 头插法,实现简单高效 targetPost->likersHead = newLiker; targetPost->likes += 1; printf("点赞成功!当前点赞数:%d\n", targetPost->likes); return 1; }
三、关键细节说明
- 遍历逻辑:从点赞者链表的头节点
likersHead开始,通过currentLiker = currentLiker->next逐个遍历节点,直到找到目标用户或遍历结束 - 内存管理:添加点赞者时需用
malloc分配节点内存,删除帖子或取消点赞时,要记得遍历链表free所有节点,避免内存泄漏 - 用户匹配:用用户指针匹配比用户名更可靠,若必须用用户名,需用
strcmp比较,且要确保用户名不会重复
内容的提问来源于stack exchange,提问作者pixiethepixel
相关产品推荐
相关产品推荐

