Заранее извиняюсь за количество кода в конце, потому что есть немного, я оставлю это до последнего.Я читаю некоторые переменные в структуре, и я хочу изменить их порядок так, чтобы число, ближайшее к 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");
}
}