【发布时间】:2014-07-22 19:24:11
【问题描述】:
我已成功创建了一个动态结构数组,但我似乎无法按课程名称对结构进行排序。我的结构减速看起来像。
struct info {
char* student;
char* courseName;
int grade;
};
我的排序函数具有以下 decleration,它的类型指针指针,因为它是使用动态内存分配创建的方式
void sort(struct info **array,int idx);
在排序之前打印已构建结构的学生、课程名称和年级成员
Khai IE 3301 69
Ashley MATH 1426 59
Alisaad CSE 1325 31
August CSE 1325 55
Ethan CSE 1320 92
Emily CSE 1310 26
Ahad IE 3301 32
Duke PHYS 1444 29
Duke MATH 2425 90
Ethan MATH 2425 42
Emily MATH 1426 16
Duke MATH 1426 28
Emily CSE 1325 0
Ravindra PHYS 1444 30
August CSE 1325 87
Ravindra IE 3301 51
Ravindra CSE 1310 55
Emily MATH 2425 1
August PHYS 1443 12
所以我要做的是对这些条目进行冒泡排序,因此在排序结束时,我的结构数组可以具有以下形式..按字母和数字排序
CSE 1310 Emily
CSE 1310 Ravindra
CSE 1320 Ethan
CSE 1325.....
IE 3301.....
我不太擅长将指针发送到函数,所以我相信这是我搞砸的地方。也许我没有像我认为的那样引用结构数组的成员并试图错误地交换条目,但这是我对数组进行排序的代码块。我在顶部包含了 string.h,并且该函数正在接收正确构建的结构数组,正如我在我的主代码块中打印它一样,但是排序将数组全部弄乱了。
void sort(struct info **array,int idx) */idx is the size of the finished structure array*/
{
int unsorted, i;
struct info temp;
do {
unsorted = 0;
for(i=0; i < idx - 1;i++)
if(strcmp(array[i]->courseName,array[i+1]->courseName) > 0)
{
temp = *array[i];
array[i] = array[i+1];
*array[i+1] = temp;
unsorted = 1;
}
}
while(unsorted);
printf("\n");
int k = 0;
for(k = 0; k < idx; k++)
printf("%s %s \n",array[k]->courseName,array[k]->student);
}
我的输出是
IE 3301 Khai
MATH 1426 Ashley
MATH 1426 Ashley
MATH 1426 Ashley
MATH 1426 Ashley
MATH 1426 Ashley
MATH 1426 Ashley
PHYS 1444 Duke
PHYS 1444 Duke
PHYS 1444 Duke
PHYS 1444 Duke
PHYS 1444 Duke
PHYS 1444 Duke
PHYS 1444 Ravindra
PHYS 1444 Ravindra
PHYS 1444 Ravindra
PHYS 1444 Ravindra
PHYS 1444 Ravindra
PHYS 1444 Ravindra
【问题讨论】:
-
格式精美,呈现良好的问题。
-
相关(好的,苗条但仍然):您也永远不会在每次迭代中减少气泡停止。这在某种程度上是冒泡排序的重点。每次通过时,“获胜者”气泡都会出现在当前的顶部插槽中,其索引(在您的情况下为
idx)会在下一次通过时减少一个。顺便说一句,在无交换检测中提前退出的逻辑是正确的,这让我有点惊讶你错过了每次通过时的停止索引减少。