Merge sort with array of structs

  • #1
103
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;
}
 

Answers and Replies

  • #2
103
0
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!
 
  • #3
Hurkyl
Staff Emeritus
Science Advisor
Gold Member
14,916
19
It says "invalid type argument of `->' ".
That's because temp[mc] isn't a pointer. You wanted `.'.
 
  • #4
nvn
Science Advisor
Homework Helper
2,128
32
Firestrider: For your first code block, would this work? temp[mc] = birthdays[count1];
 
  • #5
103
0
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)
 
  • #6
103
0
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.
 
  • #7
Hurkyl
Staff Emeritus
Science Advisor
Gold Member
14,916
19
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.
 

Related Threads on Merge sort with array of structs

  • Last Post
Replies
1
Views
5K
  • Last Post
Replies
1
Views
2K
  • Last Post
Replies
0
Views
5K
Replies
12
Views
3K
  • Last Post
Replies
6
Views
2K
Replies
2
Views
695
Replies
1
Views
669
Replies
7
Views
3K
  • Last Post
Replies
1
Views
8K
Replies
6
Views
2K
Top