You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历点赞用户列表实现帖子点赞逻辑?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:35:36