Remember to create a new directory in your repository for this lab. (Refer to previous labs for how if you have forgotten)
Review your notes about strings, structs, and linked lists. Then think about the questions in lab5questions.html. You are not turning these in because there is no lab period!
You will be adding to these functions in the homework, so do not create warmup files - instead, place all of your code in hw5.h and hw5.c.
All of the linked list operations will hold gymnasts rather than integers. The data declarations necessary for this assignment are below. These go in hw5.h, NOT hw5.c.
enum Country { USA=0, MEXICO, BRAZIL, RUSSIA, CHINA, SAFRICA,
CHILE, ROMANIA };
#define NUM_COUNTRIES 8
enum Event { UNEVEN=0, VAULT, BEAM, FLOOR };
#define NUM_EVENTS 4
typedef struct {
char *lastname;
char *firstname;
enum Country country;
float scores[NUM_EVENTS];
} gymnast_info;
// for the linked list, we will use the following struct
typedef struct _llist llist;
struct _llist{
gymnast_info *g;
llist *next;
};
// extern defines a global variable that all files can use. It is in
// the .h file, then it needs to be declared again inside a single .c file
// without the extern keyword preceeding it.
extern char *country_strings[];
void print_gymnast(gymnast_info *g, FILE *fp);
void print_list(llist *head, FILE *fp);
char *country_strings[] = { "USA", "Mexico", "Brazil", "Russia", "China", "South Africa", "Chile", "Romania"}; void print_gymnast(gymnast_info *g, FILE *fp) { fprintf(fp,"%s %s ",g->firstname, g->lastname); fprintf(fp,"%s:",country_strings[g->country]); int i; for(i=0;i<NUM_EVENTS;i++) fprintf(fp,"%f, ",g->scores[i]); fprintf(fp,"\n"); } void print_list(llist *head, FILE *fp) { llist *tmp; for(tmp = head; tmp != NULL; tmp = tmp->next) print_gymnast(tmp->g,fp); }
Write a function that allocates memory and fills in the fields for a gymnast. Make sure that you make new memory and copy over the strings - don't just copy the pointer.
If any of the inputs are NULL, then return NULL.gymnast_info *create_gymnast(char *first, char *last, enum Country c, float *scores);
Write a function that adds a gymnast to the "head" or beginning of a list. The new first node of the list will point to ginfo. It returns a pointer to the first node in the modified list.
llist* isnert_head(gymnast_info *ginfo, llist *list);
Write a function that inserts a gymnast immediately after the first gymnast from the same country. If there are no gymnasts in the list from this country, the new gymnast is inserted at the end of the list. It returns a pointer to the beginning of the modified list.
llist* insert_country(gymnast_info *ginfo, llist *list);
Write a function that returns the gymnast with the highest score in a single event. It returns a pointer to the gymnast_info, not the node. If the event number is too high, return NULL. If there are two gymnasts with the same score, you may return a pointer to either one.
gymnast_info* max_event(llist *list, unsigned int event);