I have included the code I have. These are the changes I need to make:
1) Implement a new compound data type that defines a node for a linked list of integers. This list will be used to hold multiple scores for a movie.
2) Implement a function to insert a new integer value into a linked list of integers. This will also require you to implement a function to allocate and initialize a new integer list node.
3) Expand the compound data type for 'MovieReview' so that now it contains: movie_title - A string with length 1024 movie_studio - A string with length 1024 year - An int in 1920-2999 BO_total - (the Box Office total) A float value scores_head - Head pointer to a linked list of scores for this movie
4) Modify newMovieReviewNode(), this time the newly allocated review should get an empty linked list of scores.
HERE"S THE ENTIRE CODE: #include #include #include #define MAX_STR_LEN 1024 typedef struct MovieReview_struct { char movie_title[MAX_STR_LEN]; char movie_studio[MAX_STR_LEN]; int year; float BO_total; int score; } MovieReview; typedef struct ReviewNode_struct { MovieReview review; struct ReviewNode_struct *next; } ReviewNode; ReviewNode *newMovieReviewNode() { /* * This function allocates a new, empty ReviewNode, and initializes the * contents of the MovieReview for this node to empty values. * The fields in the MovieReview should be set to: * movie_title="" * movie_studio="" * year = -1 * BO_total = -1 * score = -1 * * The *next pointer for the new node MUST be set to NULL * * The function must return a pointer to the newly allocated and initialized * node. If something goes wrong, the function returns NULL */ ReviewNode *newNode = NULL; newNode = (ReviewNode *)calloc(1, sizeof(ReviewNode)); strcpy(newNode->review.movie_title, ""); strcpy(newNode->review.movie_studio, ""); newNode->review.year = -1; newNode->review.BO_total = -1; newNode->review.score = -1; newNode->next = NULL; return newNode; // <--- This should change when after you implement your solution } ReviewNode *findMovieReview(char title[MAX_STR_LEN], char studio[MAX_STR_LEN], int year, ReviewNode *head) { ReviewNode *cur = head; while (cur != NULL) { if (strcmp(title, cur->review.movie_title) == 0 && strcmp(studio, cur->review.movie_studio)== 0 && year == cur->review.year) { return cur; } cur = cur->next; } return NULL; // <--- This should change when after you implement your solution } ReviewNode *insertMovieReview(char title[MAX_STR_LEN], char studio[MAX_STR_LEN], int year, float BO_total, int score, ReviewNode *head) { ReviewNode *p = NULL; ReviewNode *one_review = NULL; if (year<1920 || year>2999 || score < 0 || score > 100){ return head; } p = findMovieReview(title, studio, year, head); if (p==NULL){ one_review = newMovieReviewNode(); strcpy(one_review->review.movie_title, title); strcpy(one_review->review.movie_studio, studio); one_review->review.year=year; one_review->review.BO_total=BO_total; one_review->review.score=score; one_review->next=head; return one_review; } printf("Sorry, that movie already exists "); return head; // <--- This should change when after you implement your solution } int countReviews(ReviewNode *head) { /* * This function returns the length of the current linked list. This requires * list traversal.*/ int count = 0; // Count Variable ReviewNode *cur = head; // Iterate through the node and count the length. while (cur != NULL) { count++; cur = cur->next; } return count; // <--- This should change when after you implement your solution } void updateMovieReview(char title[MAX_STR_LEN], char studio[MAX_STR_LEN], int year, float BO_total, int score, ReviewNode *head) { /* * This function looks for a review matching the input query [title, studio, year]. * If such a review is found, then the function updates the Box-office total, and the score. * If no such review is found, the function prints out * "Sorry, no such movie exists at this point" */ ReviewNode *cur; // Find the current node cur = findMovieReview(title, studio, year, head); // Update the current node values if found, else print the message if ( cur != NULL) { cur->review.BO_total = BO_total; cur->review.score = score; } else { printf("Sorry, no such movie exists at this point"); } } ReviewNode *deleteMovieReview(char title[MAX_STR_LEN], char studio[MAX_STR_LEN],int year, ReviewNode *head) { /** This function removes a review matching the input query from the linked list. If no such review can * be found, it does nothing. * * The function returns a pointer to the head of the linked list (which may have changed as a result * of the deletion process) prev -> Holds the previous node cur -> Holds the current node*/ ReviewNode *prev, *cur; // Initialize the nodes cur = head; prev = head; // Iterate though the node to find the matching node and delete the current node while (cur != NULL) { if (strcmp(title, cur->review.movie_title) == 0 && strcmp(studio, cur->review.movie_studio) == 0 && year == cur->review.year) { // If current node is the head node, that is, if it is first node in the list if (cur == head) { cur = cur->next; return cur; } // If not first node, assign the previous node to next node of current node prev->next = cur->next; cur->next = NULL; // Delink current node from the list return head; } prev = cur; // Hold the current node as previous node cur = cur->next; // Traverse to next node } return head; // <--- This should change when after you implement your solution } void printMovieReviews(ReviewNode *head) { ReviewNode *current_review = head; while(current_review !=NULL) { printf("%s ", current_review->review.movie_title); printf("%s ", current_review->review.movie_studio); printf("%d ", current_review->review.year); printf("%f ", current_review->review.BO_total); printf("%d ", current_review->review.score); printf("*********************** "); current_review = current_review->next;}} void queryReviewsByStudio(char studio[MAX_STR_LEN], ReviewNode *head) { /** This function looks for reviews whose studio matches the input query. * It prints out the contents of all reviews matching the query in exactly * the same format used by the printMovieReviews() function above.*/ ReviewNode *current_review = head; while(current_review !=NULL) { if(strcmp(current_review->review.movie_studio, studio) ==0) { printf("%s ", current_review->review.movie_title); printf("%s ", current_review->review.movie_studio); printf("%d ", current_review->review.year); printf("%f ", current_review->review.BO_total); printf("%d ", current_review->review.score); printf("*********************** ");} current_review=current_review->next;}} void queryReviewsByScore(int min_score, ReviewNode *head) { /** This function looks for reviews whose score is greater than, or equal to * the input 'min_score'. * It prints out the contents of all reviews matching the query in exactly * the same format used by the printMovieReviews() function above.*/ ReviewNode *current_review = NULL; current_review = head; while(current_review !=NULL) { if(current_review->review.score>=min_score) { printf("%s ", current_review->review.movie_title); printf("%s ", current_review->review.movie_studio); printf("%d ", current_review->review.year); printf("%f ", current_review->review.BO_total); printf("%d ", current_review->review.score); printf("*********************** ");} current_review=current_review->next;}} ReviewNode *deleteReviewList(ReviewNode *head) { /** This function deletes the linked list of movie reviews, releasing all the * memory allocated to the nodes in the linked list. * Returns a NULL pointer so that the head of the list can be set to NULL after deletion.*/ ReviewNode *current_review = NULL; ReviewNode *q = NULL; current_review = head; while (current_review != NULL) { q = current_review->next; free(current_review); current_review = q; } return NULL; // <--- This should change when after you implement your solution }