When I try to run this code, all I get is a warning that gets() is too dangerous too use. And then when I run it, I get blank. I am suppose to display this:
Ollie     2.9   freshmen
John      3.2   senior  
Julie     2.2   freshmen
Joe       1.8   freshmen
Mary      3.8   senior  
Sue       3.4   junior  
Jane      2.7   senior  
Bob       2.8   senior  
Fred      3.2   freshmen
Bill      3.3   junior  
Here is my code:
Student *top = NULL; // to point top node of list
Student * temp, *temp1, *temp2; // for traversing list
// Creates the entire linked list from the file.
// Should call readNext and push
// Returns head of the linked list
Student *buildStudentList()
{
    Student *p; // will hold the data to be pushed in list
    p = readNext();
    push(&top, p);
    return top; //TODO: Change return
}
//Read a single line from standard input and return a student structure located on the heap
Student *readNext()
{
    Student *s = (Student*)malloc(sizeof(Student)); // allocating dynamic memory in heap
    printf("Please Enter Student Name, gpa, year :");
    gets(s->name);
    scanf("%f", &s->gpa);
    gets(s->year);
    s->next = NULL; // initially make next as NULL
    return s; //TODO: Change return
}
//Return a student structure stored on the heap
Student *makeStudent(char *name, float gpa, char *year)
{
    Student *s = (Student*)malloc(sizeof(Student));// allocating memory in heap
    s->name = name;
    s->gpa = gpa;
    s->year = year;
    s->next = NULL;
    return s; //TODO: Change return
}
//insert a new student node at the head of the linked list
void push(Student **list, Student *student)
{
    top = *list;
    student->next = top; // assign current top node of list to be second node of the list
    top = student; // make current node as top node of the list
    printf("push successful.\n");
}
//Insert a student node in the desired position on the linked list
void insert(Student *list, Student *s, int position)
{
    int i;
    top = list;
    temp = top;// temp is for traversing the list
    for (i = 1; i < position - 1; i++) // loop to reach desired position in the list
    {
        temp = temp->next;
    }
    if (temp == NULL)
    {
        printf("Position does not exist.\n");
    }
    else
    {
        s->next = temp->next;
        temp->next = s;
    }
}
//Displays contents of a single student structure
void display(Student *s) {
    printf("NAME:%s\t| GPA:%f\t| YEAR:%s\n", s->name, s->gpa, s->year);
}
//Displays contents of the entire linked list
void displayAll(Student *list)
{
    temp = list;
    while (temp != NULL)
    {
        display(temp);
        temp = temp->next;
    }
}
//Delete all data allocated on the heap before terminating program
void cleanUp(Student *list)
{
    temp1 = list; // will point to the top node of list
    temp2 = temp1->next; // will point to the second node of the list
    while (temp1 != NULL)
    {
        free(temp1);
        temp1 = temp2;
        temp2 = temp2->next;
    }
    printf("Cleanup Successful.\n");
}
//Main function tests your functions.
int main()
{
    Student *list, *s;
    printf("Program Started ");
    //Construct Linked List from Standard Input
    list = buildStudentList();
    //Insert a new student in desired position
    s = makeStudent("Max", 3.0, "senior");
    insert(list, s, 1);
    //Display entire linked list
    displayAll(list);
    //Free all heap memory
    cleanUp(list);
    printf("Program Successful Exit ");
    return 0;
    //exit(EXIT_SUCCESS);
}
And here is the output I am getting:
Program Started
Segmentation fault
Should I try to use the fgets() instead of gets()? The output I am trying to do is part of a different file, does that have a affect to it?
 
     
     
     
    