【问题标题】:BubbleSorting Dynamic Strcture冒泡排序动态结构
【发布时间】: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)会在下一次通过时减少一个。顺便说一句,在无交换检测中提前退出的逻辑是正确的,这让我有点惊讶你错过了每次通过时的停止索引减少。

标签: c struct logic


【解决方案1】:

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

它之所以有效,是因为没有 * 你将 array[i+1] 的地址传递给 array[i],所以它们最终指向相同的值。

【讨论】:

  • 试过了,提示结构信息中的类型不兼容
  • @ZachSantiago - 您需要显示创建数组的代码。关于你是否有一个结构数组或一个指针数组似乎有些混乱。
【解决方案2】:

不要交换结构;交换指针。你的开场白声称你有一个“结构的动态数组”,但你没有。你有一个动态的指针数组,每个指针都指向一个结构(动态与否,它并不真正相关)。

记住这一点的最简单方法是注意要交换的临时对象应该是从数组中删除的一级间接。因为你的数组是struct info **,所以临时的应该是struct info *不是 struct info.

我还冒昧地适当调整了我在您的问题下方的一般评论中提到的顶级索引减少,这应该在每次通过时完成,并修复您的函数声明行上的不正确评论(应该以/* 开头,而不是*/。生成的代码如下所示:

/*idx is the size of the finished structure array*/
void sort(struct info const **array, unsigned int idx)
{
    unsigned int swapped = 1, top = idx, i;
    while (top-- && swapped)
    {
        swapped = 0;
        for(i=0; i < top; ++i)
        {
            if (strcmp(array[i]->courseName,array[i+1]->courseName) > 0)
            {
                struct info const *temp = array[i];
                array[i] = array[i+1];
                array[i+1] = temp;
                swapped = 1;
            }
        }
    }

    /* report finale */
    for(i=0; i < idx; i++)
        printf("%s %s\n", array[i]->courseName,array[i]->student);
}

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

【讨论】:

  • @user3386109 后递减是有意的。我知道内部循环不会以1 的输入运行,但同样外部 循环不会以0 的输入运行,并且不需要单独的@ 987654331@在循环之前检测。
【解决方案3】:

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

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

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

【讨论】:

  • 这行得通,你能解释一下为什么将星点添加到结构值吗?指针对我来说很难,thx
  • 数组是结构信息**。它指向一个指针数组。这些指向结构信息类型的项目。因此,array[i] 是 struct info * 类型,因此是指向 struct info 的指针。 temp 是 struct info 类型,因此您取消引用 (*array[i]) 以获取 array[i] 指向的项目的值并将其复制到 temp 中。然后你需要复制array[i]和array[i+1]指向的结构的内容,所以你需要取消引用。根据您创建数组的方式,也可以只交换存储在数组中的指针,而不是交换数组中元素指向的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
相关资源
最近更新 更多