gpt4 book ai didi

c - C 中的递归 - 冒泡排序?

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

提前为最后的代码量道歉,因为有一点我会留到最后。我正在将一些变量读取到一个结构中,我想对它们重新排序,以便最接近 0 的数字位于顶部(它们都是负值,因为它们是分贝读数)。如果我没记错我的东西我想我可能做了冒泡排序(或一些可怕的尝试)无论如何,我决定我应该尝试用递归来解决这个问题,我可以想出 2 或 3 种方法来使用更多代码但不那么令人头疼,但我试了一下,它起作用了!

但是...一切都排序得很完美,但最后我留下了一个随机副本。我有 10 个节点,节点 [0] 到节点 [9]。我故意将包括 5 在内的所有内容都声明为空,只是作为测试,如果它没有完整的 10 个条目,它将停止。我的 printf 指示它停止了,但我最终将我的 5 个值之一复制到节点 [9] 中?

我很累,所以它可能正盯着我看,但我真的不明白这是怎么发生的。任何提示/技巧将不胜感激。此外,任何关于不良做法的观察或提高我的代码效率的方法都不会被拒绝!

不要担心硬编码值或全局变量,它用于嵌入式设备,结构将由另一个函数填充。此外,我在下面的代码中留下了所有用于调试的打印语句,供任何试图快速编译它的人使用。

谢谢

#define MAX_NAME_SIZE 16
#define MAX_RSSI_SIZE 5

struct route_data
{
char* ssid;

int rssi;
};

struct route_data nodes[9];
struct route_data temp;


void main(){
nodes[0].ssid = "N1";
nodes[0].rssi = -20;
nodes[1].ssid = "N2";
nodes[1].rssi = -40;
nodes[2].ssid = "N3";
nodes[2].rssi = -34;
nodes[3].ssid = "N4";
nodes[3].rssi = -27;
nodes[4].ssid = "N5";
nodes[4].rssi = -80;

nodes[5].ssid = "NULL";
nodes[6].ssid = "NULL";
nodes[7].ssid = "NULL";
nodes[8].ssid = "NULL";
nodes[9].ssid = "NULL";

int y =0;

while(y!=10){
printf("Node[%d] -\n\t%s\t %d\n\n",y,nodes[y].ssid, nodes[y].rssi);
y++;
}

chooseBest(0,1);

y=0;

while(y!=10){
printf("Node[%d] -\n\t%s\t %d\n\n",y,nodes[y].ssid, nodes[y].rssi);
y++;
}

}

int chooseBest(int x, int i){

//No point comparing the same values, increment up
if(x==i){
printf("X and I match - x %d\t i %d\n\n",x,i);
i++;
chooseBest(x,i);
}
//if X is less than I, and I is not null, check if i is greater than x and then swap
else if((nodes[x].rssi<nodes[i].rssi)&&(nodes[i].rssi!=0)){
printf("\nNode X Rssi %d\t Node I Rssi %d\n",nodes[x].rssi,nodes[i].rssi);
printf("Node[X] is smaller than I - i %d\n",i);
printf("X - %d\tI - %d\n\n",x,i);
if(i>x){
if(i!=0){
temp.ssid = nodes[x].ssid;
temp.rssi = nodes[x].rssi;

nodes[x].ssid = nodes[i].ssid;
nodes[x].rssi = nodes[i].rssi;

nodes[i].ssid = temp.ssid;
nodes[i].rssi = temp.rssi;
}
}
i++;
chooseBest(x,i);
}
//Is X greater than I and X is not null? If so, is X greater than I. Swap values
else if((nodes[x].rssi>nodes[i].rssi)&&(nodes[x].rssi!=0)){
printf("Node[X] is bigger\n");
printf("X - %d\tI - %d\n\n",x,i);
if(x>i)
{
temp.ssid = nodes[x].ssid;
temp.rssi = nodes[x].rssi;

nodes[x].ssid = nodes[i].ssid;
nodes[x].rssi = nodes[i].rssi;

nodes[i].ssid = temp.ssid;
nodes[i].rssi = temp.rssi;

}
i++;
chooseBest(x,i);
}
else{
//If X is null we have traversed all values
if(nodes[x].rssi==0){
printf("Nodes[x] equals null\n");
printf("X - %d\tI - %d\n\n",x,i);
return 0;
}
//Otherwise, we have reached the end of I and need to increment X and reset I
else{
printf("About to increment X\n");
printf("X - %d\tI - %d\n\n",x,i);
x++;
i=0;
chooseBest(x,i);
//printf("End of the line\n");
}

}

最佳答案

您只分配了 9 个节点,而您正在使用 10 个。这很可能会导致问题。

关于c - C 中的递归 - 冒泡排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5238635/

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