冒泡排序动态结构

时间:2014-07-22 19:24:11

标签: c struct logic

我已经成功创建了一个动态的结构数组,但我似乎无法按课程名称对结构进行排序。我的结构减速看起来像。

struct info {
char* student;
char* courseName;
int grade;
};

我的排序函数有以下的decleration,它的类型指针指针,因为它是使用动态内存分配创建的方式

void sort(struct info **array,int idx);

在排序之前打印学生,courseName和建筑结构的成绩

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 

3 个答案:

答案 0 :(得分:1)

您需要:*array[i] = *array[i+1];

它的工作原理是因为没有*你将数组[i + 1]的地址传递给array [i],所以它们指向相同的值。

答案 1 :(得分:1)

不要交换结构;交换指针。你的开头句子声称你有一个动态的结构阵列&#34;但是你没有。你有一个动态的指针数组,每个都指向一个结构(动态与否,它不相关)。

记住这一点的最简单方法是注意,您与之交换的临时应该是从您的阵列中删除的一个间接级别。由于您的数组是struct info **,因此临时数应为struct info *; struct info

我也冒昧地适当调整你在我的问题下面提到的一般评论中提到的最高指数减少,这应该在每次传递时完成,并修复你的函数声明行中的不正确评论(应该以{{1​​}}开头,而不是/*。结果代码如下所示:

*/

这是动态指针数组上的经典冒泡排序。

答案 2 :(得分:0)

您是打算交换结构值还是只是指向结构的指针?

如果你想交换结构值(这是你的代码似乎想要做的),那么你可能想要:

                temp = *array[i];
                *array[i] = *array[i+1];
                *array[i+1] = temp;
                unsorted = 1;