1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Merge sort with array of structs

  1. Mar 31, 2009 #1
    1. The problem statement, all variables and given/known data

    I need to be able to copy full structs in a temporary array based on a value in that struct (an integer), but I'm not sure exactly how to go about it. I have commented where I need to copy over structs.

    Also in the other code block, what is the problem here? It doesn't seem to reconize the string.

    2. Relevant equations

    N/A

    3. The attempt at a solution

    Code (Text):

    void Merge(struct student_birthday birthdays[], int start, int middle, int end)
    {
       int* temp, i, length, count1, count2, mc;
     
       length = end - start + 1;
       temp = calloc(length, sizeof(struct student_birthday));

       count1 = start;
       count2 = middle;
     
       mc = 0;

       while ((count1 < middle) && (count2 <= end))
       {
          if (birthdays[count1].ymd < birthdays[count2].ymd)
          {
             temp[mc] = birthdays[count1].ymd; // structs not values!
             count1++;
             mc++;
          }
       
          else
          {
             temp[mc] = birthdays[count2].ymd; // structs not values!
             count2++;
             mc++;
          }
       }

       if (count1 < middle)
       {
          for (i = mc; i < length; i++)
          {
             temp[i] = birthdays[count1].ymd; // structs not values!
             count1++;
          }
       }
     
       else if (count2 <= end)
       {
          for (i = mc; i < length; i++)
          {
             temp[i] = birthdays[count2].ymd; // structs not values!
             count2++;
          }
       }

       for (i = start; i <= end; i++)
          birthdays[i].ymd = temp[i - start]; // structs not values!

       free(temp);
    }
     
    Code (Text):

    int MonthToInt(char month[9]);

    struct student_birthday
    {
       char month[9];
    };

    int main(void)
    {
       m_int = MonthToInt(birthdays[j].month);
    }

    int MonthToInt(char month[9])
    {
        int m_int = 0;
       
        if (month == "JANUARY") m_int = 1;
        else if (month == "FEBRUARY") m_int = 2;
        else if (month == "MARCH") m_int = 3;
        else if (month == "APRIL") m_int = 4;
        else if (month == "MAY") m_int = 5;
        else if (month == "JUNE") m_int = 6;
        else if (month == "JULY") m_int = 7;
        else if (month == "AUGUST") m_int = 8;
        else if (month == "SEPTEMBER") m_int = 9;
        else if (month == "OCTOBER") m_int = 10;
        else if (month == "NOVEMBER") m_int = 11;
        else if (month == "DECEMBER") m_int = 12;
           
        return m_int;
    }
     
     
  2. jcsd
  3. Mar 31, 2009 #2
    It seems I have to use the strcmp function for the second code block.

    Does anyone know why this statement will not work:

    Code (Text):

    struct student_birthday* temp;
    int i, length, count1, count2, mc;

    length = end - start + 1;
    temp = calloc(length, sizeof(struct student_birthday));

    temp[mc]->first_name = birthdays[count1].first_name;

     
    It says "invalid type argument of `->' ". I just want to copy each individual piece of the struct one by one, or if possible the whole struct...

    Any help is appreciated!
     
  4. Mar 31, 2009 #3

    Hurkyl

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    That's because temp[mc] isn't a pointer. You wanted `.'.
     
  5. Mar 31, 2009 #4

    nvn

    User Avatar
    Science Advisor
    Homework Helper

    Firestrider: For your first code block, would this work? temp[mc] = birthdays[count1];
     
  6. Mar 31, 2009 #5
    Hi, and thanks for your help.

    When I do this:

    Code (Text):

    temp[mc].first_name = birthdays[count1].first_name;
     
    I get the error "incompatible types in assignment"

    This is the function:

    Code (Text):

    void Merge(struct student_birthday birthdays[], int start, int middle, int end)
     
     
  7. Mar 31, 2009 #6
    That works when I change temp to a pointer to a struct, but I get weird values when accessing pieces of the struct. It probably has something do with how memory is allocated.

    Does anyone know why I get that error from my previous post? I'm running into this a lot and I'm not sure why I get it.
     
  8. Apr 1, 2009 #7

    Hurkyl

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    If first_name is supposed to be an array of char, then remember that you can't copy C-style arrays by assignment.

    But... I don't see any member called "first_name" in struct student_birthday.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Merge sort with array of structs
  1. Merging sorted lists (Replies: 0)

  2. Sorting Array (Replies: 6)

  3. Merge sort (Replies: 1)

Loading...