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.wanxiangsucai.com/read/cv83608