#include #include #include typedef struct Student { int id; char name[30]; double grades; struct Student *next; } Student; // Create a student node Student *create_student(int id, char *name, double grades) { Student *student = (Student*)malloc(sizeof(Student)); student->id = id; strcpy(student->name, name); student->grades = grades; student->next = NULL; return student; } // Insert student at end of the list Student* insert_student(Student *head, int id, char *name, double grades) { Student *new_student = create_student(id, name, grades); // If the list is empty, the new student we are inserting becomes the start if(head == NULL) { return new_student; } Student *temp = head; while(temp->next != NULL) { temp = temp->next; } temp->next = new_student; return head; } void print_students(Student *head) { Student *temp = head; while(temp != NULL) { printf("Student ID: %d\n", temp->id); printf("Student Name: %s\n", temp->name); printf("Student Grades: %0.02f\n\n", temp->grades); temp = temp->next; } } Student* find_highest(Student *head) { if(head == NULL) { return NULL; } // Just exit if the list doesn't exist Student *highest = head; Student *temp = head; while(temp != NULL) { if(temp->grades > highest->grades) { highest = temp; } temp = temp->next; } return highest; } // To end the memory leaks void free_student(Student *head) { Student *temp; while(head != NULL) { temp = head; head = head->next; free(temp); } } int main() { Student *head = NULL; // Initialize the start of the linked list head = insert_student(head, 1234, "John Doe", 88.5); head = insert_student(head, 1357, "Robert W.", 91); head = insert_student(head, 2468, "Jammie R.", 33); print_students(head); Student *highest_student = find_highest(head); printf("The highest student is %s, with a grade of: %0.02f", highest_student->name, highest_student->grades); free_student(head); return 0; }