gpt4 book ai didi

c - 使用结构数组在 C 中实现排序算法的问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:09:38 25 4
gpt4 key购买 nike

这是我的小问题,首先是我的代码:


struct alumn {
char name[100];
char lastname[100];
int par;
int nota;
};<p></p>

<p>typedef struct alumn alumn;</p>

<p>int bubble(alumn **arr, int length)
{
int i,j;
alumn *temp;</p>

<pre><code>for (i=0; i<=length-2; i++) {
for (j=i+1; j<=length-1;j++) {
if ((*arr)[i].nota > (*arr)[j].nota) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
</code></pre>

<p>}</p>

<p>int main(int argc, char **argv)
{
alumn *alumns;</p>

<pre><code>... here goes some other code ...

bubble(&alumns,totalAlumns);

return 0;
</code></pre>

<p>}</p>

<p></p>

我的问题是这个算法没有对任何东西进行排序。我很难进行交换,我尝试了所有方法,但没有任何效果:(。有帮助吗???

最佳答案

显然,您将校友结构数组指向校友结构指针的数组混淆了。

Bubble 逻辑扩展了指针数组,据此 main 函数似乎使用结构数组调用它。

由于 alumn 结构的大小,对指针执行冒泡排序可能更有效,因为每次交换需要的数据移动要少得多(一个指针的 3 个副本每个几个字节,与 3 个校友结构的副本,每个 200 多个字节!)。

我建议您修改 main() 函数的逻辑(问题片段中未显示),以引入这样一个指向实际校友结构的指针数组。 (当然,这个指针数组不会让您免于分配结构本身, block (在结构数组中)或单独分配。


在您的坚持下,我在这里暗示 main 看起来如何生成气泡可用的指针数组(气泡保持不变)。
顺便说一句,我将校友声明为 alumn *alumns[] ,它更容易显示意图使用。这与 alumn **alumns 相同。

int main(int argc, char **argv)
{
alumn *alumns[]; // changed to array of pointers [to alumn structs]
// was pointer to alumn struct, likely to be used as an array thereof

int MaxNbOfAlumns = some_limit;
alumns = malloc(sizeof(*alumn) * MaxNbOfAlumns);

// Load the alumn records (from file or whereever)
// pseudo code:
// int i_alumns = 0; // points to the next free slot in alumns array
// for each record (in file or whereever...)
// alumms[i_alums] = malloc(sizeof(struct alumn));
// strcpy(alumms[i_alums]->lastname, whatever_data);
// strcpy(alumms[i_alums]->name, whatever_otherdata);
// alumms[i_alums]->par = some_int_data;
// alumms[i_alums]->nota = some_other_int_data;
// i_alums++;

... here goes some other code ...

bubble(alumns, totalAlumns); // alumns now being an array can be passed as is.

return 0;
}

或者,如果您希望像以前一样保留原始的校友变量,则可能只需要在调用 bubble() 之前做类似的事情

  int i;
alumn *ap_alumns[]; // new variable
ap_alumns = malloc(sizeof(*alumn) * totalAlumns);
for (i = 0; i < totalAlumns; i++)
ap_alums[i] = &alumns[i];
bubble(ap_alumns, totalAlumns);

应该强调的一件事是,无论它的起源如何,传递给 bubble() 的数组都可以排序,但要使用它,您需要取消引用各个指针。
因此,对于您打算使用的旧数组,例如 alumns[123].lastname,您现在需要 alumns[123]->lastname(或 ap_alumns[123]->lastname 如果你使用第二个版本)。

关于c - 使用结构数组在 C 中实现排序算法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2573381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com