c語言刷 設計題合計
阿新 • • 發佈:2021-12-14
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); */