这是我的小问题,首先是我的代码:
struct alumn {
char name[100];
char lastname[100];
int par;
int nota;
};
typedef struct alumn alumn;
int bubble(alumn **arr, int length)
{
int i,j;
alumn *temp;
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;
}
}
}
}
int main(int argc, char **argv)
{
alumn *alumns;
... here goes some other code ...
bubble(&alumns,totalAlumns);
return 0;
}
我的问题是这个算法没有排序任何东西。我很难做掉掉交换,我尝试了一切,但没有任何作用:(。任何帮助???
答案 0 :(得分:5)
显然,您将一系列alumn结构与指向 alumm struct 的指针混淆。
Bubble逻辑取代了指针数组,其中main函数似乎用结构数组调用它。
由于alumn结构的大小,对指针执行冒泡排序可能更有效,因为每次交换将需要更少的数据移动(一个指针的3个副本,每个几个字节,而3 alumn结构的副本,每个200多字节!)。
我建议你修改main()函数的逻辑(未在问题片段中显示),以引入实际alumn结构的指针数组。 (当然,这些指针数组也不会让你自己分配结构,块(在结构数组中)或单独分配。
在你的坚持下,我在暗示这里主要看起来像生成一个可用于气泡的指针数组(气泡保持不变)。
顺便说一句,我将列声明为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
。)
答案 1 :(得分:0)
您的代码不起作用,因为您有一个结构数组而不是一个指针数组。
当您尝试交换两个结构时,=运算符不知道该怎么做。您必须逐个复制结构的字段才能工作。
如果你有一个指向alumn实例的指针数组。这个代码可以工作,因为你正在分配指针。指针基本上是一个数字,而=知道如何复制数字。
答案 2 :(得分:0)
您的代码编写就好像您有一个指针数组,但是遗漏了代码的一个重要部分(即... here goes some other code ...
),因此我们无法看到您是如何设置代码的被分类。如果你有一个指针数组,这行代码:
if ((*arr)[i].nota > (*arr)[j].nota) {
应该是:
if (arr[i]->nota > arr[j]->nota) {
原因是,(* arr)获取列表中的第一个指针,然后(* arr)[i]在该指针之后得到内存中的第i个项(由于每个指针应指向一个项目,因此无意义)。第二种语法转到指针数组中的第i个指针,并取消引用它以获得该值。
也许这个插图会有所帮助:
arr points to an array of two pointers, each pointing to a struct.
(*arr)[1].nota refers to an item in ??????.
arr[1]->nota refers to an item in struct 2.
+---+ +----------+
arr -> | * | ----------------> | struct 1 |
+---+ +----------+ +----------+
| * | -> | struct 2 | : ?????? :
+---+ +----------+ +..........+