1. 程式人生 > 其它 >c語言刷 設計題合計

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); */