2012-03-13 10 views
0

私は宿題に問題があり、どこで間違っていたのか分かりません。私はバケットとkラウンドで基数ソート用の関数を設計する必要があります。バケット内のリストアイテムのシーケンスを保持する必要があるため、各バケットの前後を2つずつ保持する必要があります。 しかし、私のコードをコンパイルし、ソートする必要がある10個の数字でテストコードを実行すると、出力には3つの数字しか含まれません。 20の数字があれば、それは2だけ印刷されます。私を助けてくれますか?これは私のコードであり、あなたの時間をありがとう。編集:leastSigDigで私はここで少なくとも一つの問題があり、その悪名ため基数ソートC++割り当て

#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); 
} 
+0

削除したすべてのコードを復元しました。あなたの質問からコードを削除しないでください。あなたはそのような答えを得ることは決してありません! – razlebe

+2

Argh!私の目!! –

答えて

2

ことを変更する必要が上位桁意味:

//Linking 
int y= 0; 

for (int y; y< a-1; y++){ 

forループ影で変数y外側のスコープのyこれは、ループ内のyが初期化されておらず、雑草に入っていないことを意味します。

コンパイラの警告レベルを上げ、その内容に注意する必要があります。

+0

私はリンク部分を書き直しましたが、まだ問題が残っています – Ivan

+0

また変更されました。それ以外の場合はrear [sigDig] == NULLにカーソル== NULLバケットソート – Ivan

関連する問題