Hi all,
I am writing a phonebook program to store names and number using a list. Here is the code for the function which allows the user to enter the name and number (where the error occurs).
//THIS FUNCTION ADDS A NEW ENTRY TO THE phonebook_list
void insert(void){
//variables
int flag=0, length=0, menu=0, i=0, check=0;
NODE *p,*q, *temp;
//USER MUST ENTER FIRST NAME ONLY FOR ADDITION TO PHONEBOOK
printf("\nPlease insert the <First Name> of the entry you would like to add not separated by a space.\n");
if((temp=(NODE *)malloc(sizeof(NODE))) == (NODE *)NULL)
{
printf("Memory could not be allocated! Returning to menu...\n\n");
return;
}
scanf("%s", temp->name);
//check if name is too long for the array IF IT IS PROMPTS USER TO RE ENTER SHORTER NAME
while(flag==0)
{
length=strlen(temp->name);
if(length<50){
for(i=0;i<length;i++)
temp->name = toupper(temp->name);
flag=1;
}else{
printf("\nName is too long! Please re-enter (less than 50 characters).\n");
scanf("%s", temp->name);
length=strlen(temp->name);
}
}
//prompt user for telephone number
printf("%s",temp->number);
printf("\nPlease insert the telephone number in the following format XXXXXXXXXX.\n");
scanf("%s", temp->number);
flag=0;
//check if number has the correct number of chars
while(flag==0){
length=strlen(temp->number);
if(length==10){
flag=1;
}else{
printf("\nThis is an invalid number. Please re-enter.\n");
scanf("%s", temp->number);
length=strlen(temp->number);
}
}
printf("%s", head->name);
//IF PHONEBOOK IS EMPTY THEN THE HEAD WILL BE A NULL POINTER AND TEMP NODE WILL BE ADDED
if(head==NULL)
{
if((head=(NODE *)malloc(sizeof(NODE))) == (NODE*)NULL)
{
printf("Memory could not be allocated!\nReturning to menu...\n\n");
return;
}else{
strcpy(head->number,temp->number);
strcpy(head->name,temp->name);
head->next=tail;
free(temp);
printf("Entry successfully added.\n\n");
return;
}
}else{
//IF NEW NODE IS NOT THE FIRST ENTRY(NODE) IN PHONEBOOK(LIST) WILL LOOP THROUGH PHONEBOOK TO FIND CORRECT SPOT TO ADD
p=head;
printf("%s", p->name);
while(p->next!=NULL)
{
//IF NAME IS ALREADY IN PHONEBOOK ERROR IS GIVEN AND PROGRAM RETURNS USER TO MAIN MENU
if(strcmp(p->name,temp->name)==0)
{
printf("This name already exists in phonebook!\nReturning to menu...\n\n");
return;
//OTHERWISE THE WHILE LOOP WILL CONTINUE THROUGH LIST UNTIL IT FIND THE ADDITION THAT IS ALPHABETICALLY HIGHER
//AND WILL ADD THAT NODE IN ITS CORRECT SPOT
}else if(strcmp(p->name,temp->name)<0)
{
printf("\nTRUE\n");
temp->next=p;
temp->prev=p->prev;
p->prev->next=temp;
p->prev=temp;
printf("Entry successfully added.\n\n");
return;
}
p=p->next;
}
//IF NO NAME IS ALPHABETICALLY HIGHER, THAN IT SHOULD REACH THE LAST NODE AND WILL BE ADDED TO THE END OF THE PHONEBOOK(LIST)
if(p->next==NULL)
{
if((temp=(NODE *)malloc(sizeof(NODE))) == (NODE *)NULL)
{
printf("Memory could not be allocated!\nReturning to menu...\n\n");
return;
}
temp->next=tail;
temp->prev=q;
q->next=temp;
free(temp);
printf("Entry successfully added.\n\n");
return;
}
}
}
The program allows the user to enter the name once, but the second time around, after entering the number I get the error Bus Error: 10. I've been debugging for a few hours here and I've narrowed it down to something having to do with how the number is stored. I'm also not completely sure I understand the function of free(), because when I attempt to free(temp) and them printf("%s",temp->name) right after free(temp), it still prints whatever name had been stored in name originally.
Help please!
Thanks in advance!
Khaaliq