In my phone book program I need to give the user the option to sort their contacts alphabetically. I've managed to sort the Last names alphabetically, but the persons First name and Phone number are not sorting with their last name. Its like this:
eric c. 555-5555
steve a. 444-4444
mike b. 333-3333
when sorted alphabetically becomes:
eric a. 555-5555
steve b. 444-4444
mike c. 333-3333
Could I use something like strcat() to combine everything and then just sort by first name? Any other suggestions? I'm not sure how to approach this. Here's my entire program.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//Function prototypes
void Add();
void Delete();
void Display();
void Alphabetical();
void Number();
void Random();
void DeleteAll();
//Structure for Phonebook list
typedef struct PhoneBookList {
char *FirstName;
char *LastName;
char *PhoneNumber;
} list;
//Structure for delete
typedef struct DeleteEntry {
char *FirstName;
char *LastName;
} take;
//Pointers to structures
list *lt;
take *tk;
//Global variables
int count = 0;
int delCount = 0;
int main(void)
{
//Variable declarations
int iSelection;
do { //Print menu to screen, ask user for selection
printf("\n\nPhone Book:\n\n");
printf("1) Add friend\n");
printf("2) Delete friend\n");
printf("3) Display phone book\n");
printf("4) Sort and display entries alphabetically by last name\n");
printf("5) Find phone number for given name\n");
printf("6) Randomly select contact\n");
printf("7) Delete all contacts\n");
printf("8) Exit\n");
printf("What do you want to do? ");
scanf("%d", &iSelection);
switch (iSelection) {
case 1: //Add entry
Add();
break;
case 2: //Delete entry
Delete();
break;
case 3: //Display all entries
Display();
break;
case 4: //Sort entries alphabetically
Alphabetical();
break;
case 5: //Find phone number
Number();
break;
case 6: //Randomly select contact
Random();
break;
case 7: //Delete all contacts
DeleteAll();
break;
case 8: //Break loop and close program
break;
default: //User entered an invalid number
printf("\nYou entered an invalid selection. Try again.\n");
break;
} //End Switch
} while (iSelection != 8); //End Do While loop
//Return used memory
free(tk);
free(lt);
tk = NULL;
lt = NULL;
return 0;
} //End Main
//Function definitions
//Add an entry
void Add()
{
char *leftName;
if (count == 0)
{
lt = (list *) malloc ((count*25) + 25);
}
else
{
lt = (list *) realloc (lt, (count*50) + 50);
}
if (lt == NULL)
{
printf("You cannot add more memory\n");
}
else
{
lt[count].FirstName = (char *) malloc(sizeof(char)*15);
lt[count].LastName = (char *) malloc(sizeof(char)*15);
lt[count].PhoneNumber = (char *) malloc(sizeof(char)*15);
printf("\nEnter their First Name: ");
scanf("%s", lt[count].FirstName);
printf("\nEnter their Last Name: ");
scanf("%s", lt[count].LastName);
printf("\nEnter their Phone Number: ");
scanf("%s", lt[count].PhoneNumber);
printf("\nContact added\n");
}
count++;
}//End Function
//Delete an entry
void Delete()
{
int i;
int q = 0;
char *userName;
if (delCount == 0)
{
tk = (take *) malloc ((delCount*25) + 25);
}
else
{
tk = (take *) realloc (tk, (delCount*1) + 1);
}
if (tk == NULL)
{
printf("This cannot be deleted (out of memory)\n");
}
else
{
tk[delCount].FirstName = (char *) malloc(sizeof(char)*15);
tk[delCount].LastName = (char *) malloc(sizeof(char)*15);
printf("\nEnter their First Name: ");
scanf("%s", tk[delCount].FirstName);
printf("\nEnter their Last Name: ");
scanf("%s", tk[delCount].LastName);
}
for (i = 0; i < count; i++)
{
if (lt[i].FirstName == NULL && lt[i].LastName == NULL) continue;
if (strcmp(lt[i].FirstName, tk[delCount].FirstName) == 0 && strcmp(lt[i].LastName, tk[delCount].LastName) == 0)
{
printf("\n%s %s has been deleted\n", lt[i].FirstName, lt[i].LastName);
lt[i].FirstName = NULL;
lt[i].LastName = NULL;
lt[i].PhoneNumber = NULL;
q = 1;
break;
}
} //End for loop
if (q != 1)
{
printf("\nThis person is not in the Phonebook\n");
}
delCount++;
count--;
}//End function
//Display all phonebook entries
void Display()
{
int i;
printf("\nYour contacts:\n");
for (i = 0; i < count; i++)
{
if (lt[i].FirstName != NULL && lt[i].LastName != NULL)
{
printf("\n%s %s: %s\n", lt[i].FirstName, lt[i].LastName, lt[i].PhoneNumber);
}
}//End for loop
system("pause");
}//End function
//Sort entries alphabetically by last name.
void Alphabetical()
{
int i;
int j;
char temp[50][50];
printf("\nYour contacts:\n");
for (i = 0; i < count; i++)
{
for (j = i + 1; j < count; j++)
{
if (strcmp(lt[i].LastName, lt[j].LastName) > 0)
{
strcpy(temp[i], lt[i].LastName);
strcpy(lt[i].LastName, lt[j].LastName);
strcpy(lt[j].LastName, temp[i]);
}
}
}//End for loop
for (i = 0; i < count; i++)
printf("\n%s %s: %s\n", lt[i].FirstName, lt[i].LastName, lt[i].PhoneNumber);
system("pause");
}//End function
//Find phone number for given name
void Number()
{
int i;
int q = 0;
char fName[25];
char lName[25];
printf("\nEnter their First Name: ");
scanf("%s", fName);
printf("\nEnter their Last Name: ");
scanf("%s", lName);
for (i = 0; i < count; i++)
{
if (strcmp(lt[i].FirstName, fName) == 0 && strcmp(lt[i].LastName, lName) == 0)
{
printf("\n%s %s's phone number is: %s\n", lt[i].FirstName, lt[i].LastName, lt[i].PhoneNumber);
q = 1;
break;
}
}
if (q != 1)
{
printf("\nThis person is not in the Phonebook\n");
}
system("pause");
}//End function
//Randomly select contact
void Random()
{
srand(time(NULL));
int iRandomNum;
iRandomNum = (rand() % count) + 1;
printf("%s %s: %s\n", lt[iRandomNum].FirstName, lt[iRandomNum].LastName, lt[iRandomNum].PhoneNumber);
system("pause");
}//End function
//Delete everyone from phone book
void DeleteAll()
{
int i;
for (i = 0; i < count; i++)
{
do{
lt[i].FirstName = NULL;
lt[i].LastName = NULL;
lt[i].PhoneNumber = NULL;
break;
} while (i <= count);
}
printf("\nAll contacts deleted\n\n");
system("pause");
}//End function