c语言刷 设计题合计

355. 设计推特

#define MAX_LEN 512

struct User {
    int userId;
    int followee[MAX_LEN]; // 散列表,0/1,1表示这个user被关注
    struct User *next;
};

struct Tweet {
    int userId;
    int tweetId;
    struct Tweet *next;
};

typedef struct {
    struct User *user;
    struct Tweet *tweet
} Twitter;


Twitter* twitterCreate() 
{
    Twitter* obj = (Twitter*)malloc(sizeof(Twitter));
    obj->user = (struct User*)malloc(sizeof(struct User));
    obj->tweet = (struct Tweet*)malloc(sizeof(struct Tweet));
    obj->user->next = NULL;
    memset(obj->user->followee, 0, sizeof(int) * MAX_LEN);
    obj->tweet->next = NULL;
    return obj;
}

/*
* 注意:
* 这里只给推文这个结构体增加了userId,但是没有给用户这个结构体加,
* 所以后续用户这个结构体可能会得到user是NULL,但是不能返回空
*/
void twitterPostTweet(Twitter* obj, int userId, int tweetId) 
{
    struct Tweet *node = (struct Tweet *)malloc(sizeof(struct Tweet));
    node->userId = userId;
    node->tweetId = tweetId;
    // 头插法
    node->next = obj->tweet->next;
    obj->tweet->next = node;
}

int* twitterGetNewsFeed(Twitter* obj, int userId, int* retSize) 
{
    struct User *user = obj->user->next;
    struct Tweet *tweet = obj->tweet->next;
    int *res = (int *)malloc(sizeof(int) * 10);
    *retSize = 0;
    while (user != NULL && user->userId != userId) {
        user = user->next;
    }
    if (user == NULL) {
        // 还是要遍历推文结构体
        while (tweet != NULL && (*retSize < 10)) {
            if (tweet->userId == userId) {
                res[(*retSize)++] = tweet->tweetId;
            }
            tweet = tweet->next;
        }
        return res;
    }
    
    while (tweet != NULL && (*retSize < 10)) {
        if (tweet->userId == userId || user->followee[tweet->userId] == 1) {
            res[(*retSize)++] = tweet->tweetId;
        }
        tweet = tweet->next;
    }
    return res;
}

void twitterFollow(Twitter* obj, int followerId, int followeeId) 
{
    struct User *user = obj->user;
    // 查询用户链表中是否有这个用户节点
    while (user->next != NULL && user->userId != followerId) {
        printf("loop \n");
        user = user->next;
    }
    // 有:设置标志位为1
    if (user->userId == followerId) {
        user->followee[followeeId] = 1;
    } else {
        // 没有:新建一个节点
        struct User *node = (struct User *)malloc(sizeof(struct User));
        node->userId = followerId;
        node->followee[followeeId] = 1;
        node->next = obj->user->next;
        obj->user->next = node;
    }
}

void twitterUnfollow(Twitter* obj, int followerId, int followeeId) 
{
    struct User *user = obj->user;
    while (user->next != NULL && user->userId != followerId) {
        user = user->next;
    }
    if (user->userId == followerId) {
        user->followee[followeeId] = 0;
    }
}

void twitterFree(Twitter* obj) 
{
    free(obj->user);
    free(obj->tweet);
    free(obj);
}

/**
 * Your Twitter struct will be instantiated and called as such:
 * Twitter* obj = twitterCreate();
 * twitterPostTweet(obj, userId, tweetId);
 
 * int* param_2 = twitterGetNewsFeed(obj, userId, retSize);
 
 * twitterFollow(obj, followerId, followeeId);
 
 * twitterUnfollow(obj, followerId, followeeId);
 
 * twitterFree(obj);
*/
原文地址:https://www.cnblogs.com/kongweisi/p/15687418.html