I have a problem with my homework assignment and I do not know where I went wrong with it. I have to design a function for radix sort with a a buckets and k rounds. I need to preserve the sequence of the list items in the bucket and therefore I need to keep two points for each bucket – to front and rear.
However, when I compile my code and run my test code with 10 numbers that need to be sorted, my output contains only 3 numbers. If its 20 numbers, it prints only 2. Can you help me please? This is my code and thank you for your time. Edit: by leastSigDig i mean Significant Digit i have to change that because its a bad name
#include <cstdlib> // Provides size_t and NULL
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
struct listnode { struct listnode * next;
unsigned long value; } ;
struct listnode *radixsort (struct listnode *data, int a, int k){
struct listnode *front [a], *rear [a], *cursor;
int i=0 , j = 0, leastSigDig,base10num;
if (data == NULL) {return data;}
for (i;i<k;i++){
base10num= pow(a,i);
cursor = data;
for (j=0; j<a; j++){
front [j] = NULL;
rear [j] = NULL;
}
while (cursor != NULL){
leastSigDig = ((cursor->value)/base10num)%a;
if (rear [leastSigDig]!= NULL){
rear[leastSigDig]->next= cursor;
rear [leastSigDig]= cursor;
}
else if (cursor == NULL) {
rear [leastSigDig] = cursor;
}
cursor = cursor->next;
}
//Linking
cursor = NULL;
for (int y=0; y< a-1; y++){
int z= y+1;
if (front [y] == NULL)
continue;
else if (cursor == NULL){
cursor = front [y];
rear [y]->next = front [z];
}
else if (cursor != NULL)
rear [y]->next = front [z];
data = cursor;
}
}
}
return data;
}
int main(void)
{
long i, length=10;
long a = 10; // working with base 10
long k = log10(length*a);
struct listnode *node, *space;
space = (struct listnode *) malloc(length*sizeof(struct listnode));
for( i=0; i< length; i++ ) {
(space + i)->value = 2*((17*i)%length);
(space + i)->next = space + (i+1);
}
(space+(length-1))->next = NULL;
node = space;
struct listnode * temp =node;
cout<<endl<<"List before radixsort\n" <<endl ;
while(temp!=NULL)
{
cout << temp->value << "\t";
temp = temp->next;
}
node = radixsort(node,a,k);
listnode *check = node;
cout << "\n\nList after radixsort \n\n";
while (check)
{
cout << check->value << "\t";
check = check->next;
}
cout << "\n\n";
exit(0);
}
There is at least one problem here:
The variable
yin theforloop shadows theyin the outer scope. This means theyinside the loop is uninitialized and you are off into the weeds.You should turn up the compiler warning level and pay attention to what it says.