2014-01-07 2 views
0

Я новичок в C, и я предполагаю, что мой код находится далеко от лучшей практики ..Отсортировать массив структуры с общим размером

У меня есть массив структур в моей C программе. Размер массива равен 255 (выделено), но не все из них используются.

Массив в моем eample заполняется следующим vaues:

2;a;121212;121212;0 
9;c;121212;121212;1 
6;d;121212;121212;1 
4;e;121212;121212;1 
1;v;121212;121212;1 
8;x;121212;121212;1 

остальное заполняется нулевыми значениями .. (я думаю)

Теперь моя проблема не с фактической сортировкой. Это когда я начну сортировку, это придет к тому, чтобы взять пустой указатель моего массива и провалиться.

массив книг:

struct book{ 
    int ID; 
    char name[MAX_STR_LEN]; 
    char dateIn[DATE_LEN]; 
    char dateOut[DATE_LEN]; 
    int isIn; 
}; 


/* array of my books */ 
struct book books[MAX_BOOKS]; 

Функция сортировки:

void sort() 
{ 
    /* first find out how many indexes there are */ 
    int h; 
    for (h = 0; h< MAX_BOOKS; h++) 
    { 
     if (books[h].ID == 0) 
     { 
      break; 
     } 
    } 

    int j = 0; 

    int swaped = 1; 
    struct book temp; 
    while (swaped == 1)  //bubble sort on the book name 
    { 
     for(j=0;j< h ;j++) 
     { 
      swaped = 0; 
      if(strcmp(books[j].name,books[j + 1].name)>0) 
      { 

       //copy to temp val 
       temp.ID = books[j].ID; 
       strcpy(temp.name,books[j].name); 
       strcpy(temp.dateIn,books[j].dateIn); 
       strcpy(temp.dateOut,books[j].dateOut); 
       temp.isIn = books[j].isIn; 


       //copy next val 
       books[j].ID = books[j + 1].ID; 
       strcpy(books[j].name,books[j + 1].name); 
       strcpy(books[j].dateIn,books[j + 1].dateIn); 
       strcpy(books[j].dateOut,books[j + 1].dateOut); 
       books[j].isIn = books[j + 1].isIn; 


       //copy back temp val 
       books[j + 1].ID = temp.ID; 
       strcpy(books[j+ 1].name,temp.name); 
       strcpy(books[j + 1].dateIn,temp.dateIn); 
       strcpy(books[j + 1].dateOut,temp.dateOut); 
       books[j + 1].isIn = temp.isIn; 


       swaped = 1; 

      } 
     } 
    } 

} 

Так что мой вопрос будет, если его можно значения сорта только где ID не 0?

Если вам нужна дополнительная информация, я буду стараться доставить ..

Заранее спасибо!

ответ

4
for(j=0;j< h ;j++) 
{ 
    if(strcmp(books[j].name,books[j + 1].name)>0) 
    { 

Здесь вы принимаете j от 0 до h-1 включительно. Итак, вы пытаетесь сравнить для j == h-1 последний элемент books[j] со следующим books[j+1], которого не существует. Вероятно, вы хотите только проверить пару h-2/h-1, то есть for(j=0; j<h-1; j++).

+0

Спасибо большое! Трудно было выбрать один ответ, потому что все вместе помогли мне! –

3

Почему вы делаете такие большие вычисления для подкачки? почему вы просто не делаете

if(strcmp(books[j].name,books[j + 1].name)>0){ 

    temp = books[j]; 
    books[j] = books[j+1]; 
    books[j+1] = temp; 
} 

И можно отсортировать массив структур. Если вы можете выполнять свопинг по структуре, вы можете выполнить любой алгоритм сортировки.

изменить это состояние if(strcmp(books[j].name,books[j + 1].name)>0) до if(books[j].ID>books[j + 1].id), то вы можете отсортировать структуру по отношению к ID.

Но следуйте также ответам @ Набла.

+0

Спасибо за вашу помощь! –

2

Ответ Наблы является правильным. Кроме того, вы установили swapped = 0; в неправильном месте. У вас есть:

while (swapped == 1)  //bubble sort on the book name 
{ 
    for (j = 0; j < h; j++) 
    { 
     swapped = 0; 

но вы хотите:

while (swapped == 1)  //bubble sort on the book name 
{ 
    swapped = 0; 
    for (j = 0; j < h; j++) 
    { 
+1

Большое спасибо за вашу помощь! –

Смежные вопросы