Thread: Sorting Alphabetically problem

  1. #1
    Registered User
    Join Date
    Oct 2011
    Posts
    8

    Sorting Alphabetically problem

    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

  2. #2
    Just a pushpin. bernt's Avatar
    Join Date
    May 2009
    Posts
    426
    Code:
    void Alphabetical()
    {
        ...
        strcpy(temp[i], lt[i].LastName);
        strcpy(lt[i].LastName, lt[j].LastName);
        strcpy(lt[j].LastName, temp[i]);
        ...
    }
    Of course it's only sorting the last names. That's exactly what you tell the program to do.

    What I would do here is swap the structs themselves. That's really what one expects from sorting: for the elements (of type struct PhoneBookList) in the list to be sorted according to their LastNames (which in this case would be called the struct's key).
    Consider this post signed

  3. #3
    Banned
    Join Date
    Aug 2010
    Location
    Ontario Canada
    Posts
    9,547
    What bernt said... ( beat me to it by mere seconds...)

    Plus you could make your life a lot simpler if you did this...
    Code:
    //Structure for Phonebook list
    typedef struct PhoneBookList {
            
            char FirstName[16];
            char LastName[16];
            char PhoneNumber[16];
    } list;
    That lets you get rid of all the malloc() calls you're making since the data is right in the struct. It also lets you enter data directly into the struct...

  4. #4
    Registered User
    Join Date
    Sep 2006
    Posts
    8,868
    Yes, you can, but you don't probably want to.

    You should be using a struct to group together the different parts of each record.

    One person equals one record and equals one struct in C. I use the terms record and struct, and field and member, interchangeably so don't get confused.
    Code:
    struct student {
       char lname[26];   //these are fields or struct members
       char fname[26];   //use the dot operator to access
       char phone[8];     //or a pointer to the struct and ->
       char areaCode[4];
    };
    Add fields as needed. This goes in global space, before main().

    Then declare the array of structs in main, and pass around as needed to your other functions.

    Code:
    struct student studs[1000]; //array of structs, 
    
    //Then in your sorting code, you can compare fields:
    
    if(studs[i].phone > studs[i+1].phone) {
       //you can also swap structs directly
       tempStud = studs[i];
       studs[i] = studs[i+1];
       studs[i+1] = tempStud;
    }
    Edit: Nina posted again!

  5. #5
    Banned
    Join Date
    Aug 2010
    Location
    Ontario Canada
    Posts
    9,547
    Quote Originally Posted by Adak View Post
    Then declare the array of structs in main, and pass around as needed to your other functions.

    Code:
    struct student studs[1000]; //array of structs, 
    
    //Then in your sorting code, you can compare fields:
    
    if(studs[i].phone > studs[i+1].phone) {
       //you can also swap structs directly
       tempStud = studs[i];
       studs[i] = studs[i+1];
       studs[i+1] = tempStud;
    }
    Edit: Nina posted again!
    Actually I'm pretty shure you don't want to declare an array of 1000 structs... on the stack inside main.

    This is one case where one should "go global" or you can declare it in main with static scope.

  6. #6
    Registered User
    Join Date
    Sep 2006
    Posts
    8,868
    Yeeeeepppp! ^^^^

  7. #7
    Lurking whiteflags's Avatar
    Join Date
    Apr 2006
    Location
    United States
    Posts
    9,612
    malloc can give you 1000 structs.... probably.

  8. #8
    Banned
    Join Date
    Aug 2010
    Location
    Ontario Canada
    Posts
    9,547
    Quote Originally Posted by whiteflags View Post
    malloc can give you 1000 structs.... probably.
    that too!

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Sorting an array alphabetically?
    By bluebob in forum C Programming
    Replies: 7
    Last Post: 03-09-2011, 04:53 AM
  2. Alphabetically sorting argv[]
    By serg_yegi in forum C Programming
    Replies: 7
    Last Post: 03-27-2010, 07:25 PM
  3. sorting alphabetically
    By ahming in forum C Programming
    Replies: 8
    Last Post: 05-26-2005, 10:34 AM
  4. Sorting Alphabetically
    By orgy230 in forum C Programming
    Replies: 1
    Last Post: 12-04-2004, 02:28 PM