我是C的新手,我想我的代码远离最佳实践..
我的C程序中有一个struct数组。数组的大小为255(已分配),但并非全部使用。
我的示例中的数组充满了以下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的值进行排序吗?
如果您需要更多信息,我会尝试提供..
提前致谢!
答案 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++)
。
答案 1 :(得分:3)
为什么你要做这么大的交换计算?你为什么不这么做?
if(strcmp(books[j].name,books[j + 1].name)>0){
temp = books[j];
books[j] = books[j+1];
books[j+1] = temp;
}
可以对结构数组进行排序。如果你能够交换struct,那么你可以做任何类型的排序算法。
将此条件if(strcmp(books[j].name,books[j + 1].name)>0)
更改为if(books[j].ID>books[j + 1].id)
,然后您可以针对ID
对结构进行排序。
但请关注@ Nabla的回答。
答案 2 :(得分:2)
Nabla的回答是对的。另外,您将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++)
{