gpt4 book ai didi

c - 我对 c 中的列表进行了冒泡排序,我想知道我是否犯了任何特定错误

转载 作者:行者123 更新时间:2023-11-30 14:58:48 29 4
gpt4 key购买 nike

它似乎有效,但我想知道特定情况是否会使我的算法崩溃。有人对我的程序无法涵盖的隐藏特定情况有任何想法吗?我知道这不是对列表进行排序的正确方法,但这是我必须做的。

struct Student {
float medie;
char nrMatricol[10];
char *nume;
char facltate[6];


};
struct Nod{
Student stud;
Nod* next;
};
Nod* inserareNodEnd(Nod *l,Student st)
{
Nod *nou = (Nod*)malloc(sizeof(Nod));
nou->next = NULL;//NOU->NEXT=0
nou->stud = st;
if (!l) {
//lista este goala
return nou;
}
else
{
//lista contine un nod
Nod *t = l;
while (t->next) {
t = t->next;
}
t->next = nou;
return l;
}

}

Nod * interschimbare(Nod *l, Nod *pred) {
Nod *aux=l;
//Nod *auxPred = pred;
//Nod *auxPredNext =pred->next;
if (pred) {
//caz general
Nod *p, *q, *r;
pred = pred->next;
q = p->next;
r = q->next;
pred->next = q;
p->next = r;
q->next = p;
}
else {
//interschimb noduri 1 cu 2
Nod *p, *q;
p = l->next;
q = p->next;
l->next = q;
l = p;


}
return l;
}
Nod* sortareBubble(Nod* l) {
char dinNou; // flag interschimb noduri

if (!l && !l->next)
return l; //lista trebuie sa contina cel putin 2 noduri

do {
dinNou = 0; // 0 -> ipoteza fara interschimb
Nod *tmp = l, *pred = 0;
while (tmp->next) {
if (tmp->stud.medie > tmp->next->stud.medie) {
l = interschimb(l, pred);
dinNou = 1;
if (pred) {
pred = pred->next;
}
else {
pred = l;
}
}
else {
pred = tmp;
tmp = tmp->next;
}
}

} while (dinNou == 1);

return l;

}

最佳答案

您再次使用dinNou来检查是否需要再次进入循环。循环是一个do-whiledinNou初始化为0,如果发生变化,那么它将被修改为1。本质上,你进行改变,直到没有改变为止。您有一个错误导致无限循环

while (tmp->next);

如果tmp(已初始化为l)碰巧没有next元素,则此值为假。否则,它会反复询问是否有 next 元素,并且由于没有变化,因此它始终为 true,从而导致无限循环。在我看来,您真正想要的是使用 while 后面的 block 作为要完成的操作 while tmp has next 。要实现这一点,只需删除分号即可:

while (tmp->next)

完成此操作后,在循环内检查当前学生的平均分数是否高于下一个学生。如果是这样,那么您调用 interschimbare (交换)并将 dinNou 设置为 1。这似乎也是不正确的。如果必须交换两个相邻值,则应调用 tmptmp->nextinterschimbare。因此,您实际上并不需要 pred 变量,并且无论是否交换,都需要将 tmp 设置为 tmp->next完成与否。或者更好的是,如果发生交换,您可以打破循环。

关于c - 我对 c 中的列表进行了冒泡排序,我想知道我是否犯了任何特定错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43155803/

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