The bolded section of my code is what I am having trouble on. It seems to work, but when I go to print what is in index 3, after concatenating index 0 and index 1 to index 3, The program crashes. But before it crashes it tells me the result and it is correct. I know my print/output method is correct because when I make a new string, it gives me the correct response, it just wont work for concatenate. What am i doing wrong?Code:#include <stdio.h> #include <stdlib.h> // needed for malloc, free struct node { // a node in the linked list char data; struct node *next; }; int menu(void); // display list of choices, get user's choice struct node *addString(struct node *, const char *, int *, struct node *[]); // Add a string (char array) to the list void output(struct node *f, int *, struct node *[]); // Output a string based on a users selected index void stringLength(struct node *f, int *, struct node *[]); // Output the length of a string based on a users selected index struct node *concatenate(struct node *f, int *, int *, int *, struct node *[]); // concatenate 2 strings together struct node *insertChar(struct node *, int *, char *, int *, struct node *[]); // Insert a character at a given position of a string struct node *del(struct node *, int *, int *, struct node *[]); // Delete a character at a given position of a string struct node *destroy(struct node *, int *, struct node *[]); // deallocate a user specified list struct node *destroyAll(struct node *, struct node *[]); // deallocate all lists int main(void) { struct node *front; // front points to the front of our list struct node *linkedListStrings[5] = {NULL, NULL, NULL, NULL, NULL}; //an array of 5 struct node pointers int optionsResponse; // User input for main menu options int index = 0; // Index of the first or only string used int index2; // Index of the second string used int index3; // Index of the third string used (concatination) int position; // The posiiton in the string to insert characters char insertedCharacter; // The users input character to be inserted into the linked list char response[20]; // user input for sub menu options int i; front = NULL; // initialize list to NULL do // display menu, do command, quit when user inputs choice 8 { optionsResponse = menu(); switch(optionsResponse) { case 1 : // Adding a new string for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); printf ("Enter a new string: "); scanf("%s", response); printf ("Enter a node to place it in [0-4]: "); scanf("%d", &index); addString(front, response, &index, linkedListStrings); printf("\n"); for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); break; case 2 : for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); // printing a string from a selected index printf ("Enter the index of the string that you would like to output [0-4]: "); scanf("%d", &index); output(front, &index, linkedListStrings); for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); break; case 3 : for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); // printing the length of a string from a selected index printf ("Enter the index of the string [0-4]: "); scanf("%d", &index); stringLength(front, &index, linkedListStrings); for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); break; case 4 : for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); // concatenating two strings together and selecting an index to place the new string printf ("Enter the index of the first string [0-4]: "); scanf("%d", &index); printf ("Enter the index of the second string [0-4]: "); scanf("%d", &index2); printf ("Enter an index to place the concatenated string [0-4]: "); scanf("%d", &index3); concatenate(front, &index, &index2, &index3, linkedListStrings); for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); break; case 5 : for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); // Inserting a character into a position of specifed string printf ("Enter the index of the string [0-4]: "); scanf("%d", &index); getchar(); printf ("Enter a character to be inserted into the string: "); scanf("%c", &insertedCharacter); printf ("\nEnter the position in the string at \nwhich you would like to insert a character: "); scanf("%d", &position); insertChar(front, &index, &insertedCharacter, &position, linkedListStrings); for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); break; case 6 : for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); // Deleting a character from a specified position printf ("Enter the index of the string [0-4]: "); scanf("%d", &index); printf ("Enter the position in the string corresponding \nto the character you would like to delete: "); scanf("%d", &position); del(front, &index, &position, linkedListStrings); for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); break; case 7 : for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); // destroying/deleting a string printf ("Enter the index of the string to be destroyed [0-4]: "); scanf("%d", &index); destroy(front, &index, linkedListStrings); for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); break; case 8 : for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); // destroying/deleting a string destroyAll(front, linkedListStrings); for(i=0;i<5;i++) printf("%d\t%p\n", i, linkedListStrings[i]); break; } } while(optionsResponse != 9); destroyAll(front, linkedListStrings); } int menu(void) // display menu and get user's choice { int temp; printf("Please select from one of the following String menu options: \n\n"); printf("1.\tCreate a new string\n"); printf("2.\tOutput a string\n"); printf("3.\tOutput the length of a string\n"); printf("4.\tConcatenate two strings together\n"); printf("5.\tInsert a character at a given position of a string\n"); printf("6.\tDelete a character at a given position of a string\n"); printf("7.\tDestroy a string\n"); printf("8.\tDestroy all strings\n"); printf("9.\tQuit\n\n"); printf("I choose option number: "); scanf("%d", &temp); return temp; } struct node *addString(struct node *f, const char *response, int *index, struct node *linkedListStrings[])// Add a string (char array) to the list { int i = 0; // i will act as a counter to print values from the array // create a new node, store response as the datum struct node *temp = (struct node *)malloc(sizeof(struct node)); struct node *front = f; // front points to the front of our list if (linkedListStrings[*index] != NULL) // Tests to make sure a node was not already created at the index specified { printf("Error - A string already exists at location %d", *index); } else { /* While the character in the char array is not '\0' iterate through the array and add each value to the node */ f = linkedListStrings[*index]; while(response[i] != '\0') { if(f == NULL) // if f is NULL store the value in the first node { front = f = (struct node *)malloc(sizeof(struct node)); f->data = response[i++]; f->next = NULL; } else if(f->next == NULL) // If f is not null, find the next NULL node and store data to it { temp = (struct node *)malloc(sizeof(struct node)); temp->data = response[i++]; temp->next = NULL; f->next = temp; } else // If f is not null and the next node in the list is not null, move to the next node { f = f->next; } } linkedListStrings[*index] = front; // front of the list as it has not been modified } return *linkedListStrings; } void output(struct node *f, int *index, struct node *linkedListStrings[]) // Output a string based on a users selected index { struct node *front = f; // front points to the front of our list f = linkedListStrings[*index]; if (f == NULL) // Error checking to prevent the user from selecting a NULL index { printf("A string has not been created for index %d\n", *index); } else { printf("String at index %d is: ", *index); while(f != NULL) // iterate through the list, printing each node's datum { printf("%c", f->data); f = f->next; } } printf("\n\n"); } struct node *concatenate(struct node *f, int *index, int *index2, int *index3, struct node *linkedListStrings[]) // concatenate 2 strings together { struct node *front = f; // front points to the front of our list struct node *node1; // points to linkedListStrings[*index] struct node *node2; // points to linkedListStrings[index2] struct node *node3; // points to linkedListStrings[index3] struct node *temp; // temporary value holder struct node *frontNode3; // Points to the front of node3 (linkedListStrings[index3]) f = node1 = linkedListStrings[*index]; node2 = linkedListStrings[*index2]; //frontNode3 = node3 = malloc(sizeof(struct node)); frontNode3 = node3 = (struct node *)malloc(sizeof(struct node)); // ADDED if(linkedListStrings[*index] != NULL) // Make sure that the first user specified linked list is not empty { if (linkedListStrings[*index2] != NULL)// Make sure that the second user specified linked list is not empty { if (linkedListStrings[*index3] == NULL) // Make sure that the location to place the concatenated strings is empty { while(f != NULL) // Add linkedListStrings[*index] to the user specified location { node3->data = f->data; //temp = malloc(sizeof(struct node)); temp = (struct node *)malloc(sizeof(struct node)); // ADDED node3->next = temp; f = f->next; node3 = node3->next; } f = node2; while(f != NULL) // Add linkedListStrings[index2] at the end of linkedListStrings[*index] of the user specified location { node3->data = f->data; //temp = malloc(sizeof(struct node)); temp = (struct node *)malloc(sizeof(struct node)); // ADDED f = f->next; if(f != NULL) { node3->next = temp; node3 = node3->next; } } linkedListStrings[*index3] = frontNode3; // front of the list 3 as it has not been modified } else // Error - linkedListStrings[index3] != NULL { printf("A string already exists at location %d \n", *index3); } } else // Error - linkedListStrings[index2] = NULL { printf("A string has not been created for location %d\n", *index2); } } else // Error - linkedListStrings[*index] = NULL { printf("A string has not been created for location %d\n", *index); } return *linkedListStrings; }