I understand what you are going through. In most CS curricula, the first few classes are weed out classes. I went through this myself at my undergrad Comp Sci program, many, many years ago.
But you really should have asked for help sooner, having just a few things done the night before the project is due is a difficult place to be in, and it is going to be very hard to complete by tomorrow.
I will give you some advice, as soon as you get a programming assignment, you have to start it that night. Otherwise, you will not be able to complete the assignment. They usually give you a couple of weeks per assignment, and between learning the new concepts they throw at you and learning the syntax of the language, you will need every night to not only complete the assignment, but get a good grade on it.
I will try to point you in the right direction, but if you cannot get an extension for the project, you may have to drop the class and retake it next semester.
Assuming that all you need to keep track of is courses and students in each course and there is no correlation between the same student in multiple courses, probably the easiest approach is to have a linked list for courses and inside each element of the courses linked list have a linked list of students in the course.
So your element structures will look something like this:
typedef struct studentElement
{
char *studentName;
int grade;
struct studentElement *next;
}student;
typedef struct courseElement
{
char *name;
struct studentElement *list;
struct courseElement *next;
}course;
to allocate a student element:
student *newStudent;
newStudent = (student *) malloc(sizeof(student));
to allocation a course element:
course *newCourse;
newCourse = (course *) malloc(sizeof(course));
For the course linked list, you will need to have a pointer to the head of the list that will always point to the first element of the list. You will also need another pointer that will start out pointing at the head of the list and be used to traverse the list to search for the list elements to update and print. If sort order of the list does not matter, you probably want to have a tail pointer that will point to the last element of the course list so you can quickly and easily add a new element to the list.
course *head, *tail, *current;
Repeat this functionality for the student list contained in each course element.
To get data in the the course and student lists, the quick and dirty approach would be to have your main method prompt the user to add a new course, add a new student to course, or add a grade to a student. You can use 1, 2, and 3, for user choices, so if the user enters 1 prompt for all of the information needed for the course, create the course node, and add it to the course linked list. Get this course part working first, then move on to the harder part of adding students to each course. Depending on what your requirements are, you may need to throw exceptions if the user enters duplicate data or invalid data. Be sure to check for this.
Good luck!