Merge sort with array of structs

  • Thread starter Thread starter Firestrider
  • Start date Start date
  • Tags Tags
    Array Sort
AI Thread Summary
The discussion centers on implementing a merge sort for an array of structs in C, specifically focusing on copying structs based on an integer value. The user struggles with correctly copying entire structs instead of just their values, leading to errors in memory allocation and assignment. The issue with string comparison is highlighted, indicating the need to use the `strcmp` function instead of direct string comparison. Additionally, there are complications with accessing struct members, particularly when trying to copy character arrays, which cannot be assigned directly. The conversation emphasizes the importance of understanding struct memory management and proper syntax in C programming.
Firestrider
Messages
104
Reaction score
0

Homework Statement



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.

Homework Equations



N/A

The Attempt at a Solution



Code:
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:
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;
}
 
Physics news on Phys.org
It seems I have to use the strcmp function for the second code block.

Does anyone know why this statement will not work:

Code:
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!
 
Firestrider said:
It says "invalid type argument of `->' ".
That's because temp[mc] isn't a pointer. You wanted `.'.
 
Firestrider: For your first code block, would this work? temp[mc] = birthdays[count1];
 
Hi, and thanks for your help.

When I do this:

Code:
temp[mc].first_name = birthdays[count1].first_name;

I get the error "incompatible types in assignment"

This is the function:

Code:
void Merge(struct student_birthday birthdays[], int start, int middle, int end)
 
nvn said:
Firestrider: For your first code block, would this work? temp[mc] = birthdays[count1];

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.
 
Firestrider said:
Code:
temp[mc].first_name = birthdays[count1].first_name;

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.
 
Back
Top