一日悩んでます

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
るーたん

一日悩んでます

#1

投稿記事 by るーたん » 7年前

c++です。
ずっといろいろなサイト様を参考にしたり、参考書など目を通しましたがしっくりきません。
バケットの基数ソートなんですが、
スタックからキューへ直したいです。

どこをいじればいいかと。
1から別のものでならスタック操作のものキュー操作のものそれぞれ作れたのですがこのプログラムだと上手く完成までもっていけません。
よろしくお願いします。

コード:

#include <stdio.h>
#include <stdlib.h>
#define N 100  /* 配列Aの最大サイズ */
#define m 10 /* 値の範囲は[0,1,...,m-1] */
#define K 3     /* 語長 */
struct word    /* 構造体wordの宣言 */
{
 int letter[K];
};
struct cell       /* 構造体cellの宣言 */
{
 int index;
 struct cell *next;
};
/* 関数の宣言 */
void radixsort(struct word *A, int *idx, int n);
void bucketsort(struct word *A, int *idx, int n, int k);
void insert(struct word *A, int idx, struct cell **B, int k);
int main()  
{
 struct word A[N];
A[0].letter[0]=2; A[0].letter[1]= 2; A[0].letter[2]= 1;
A[1].letter[0]=6; A[1].letter[1]= 5; A[1].letter[2]= 0;
A[2].letter[0]=0; A[2].letter[1]= 2; A[2].letter[2]= 3;
A[3].letter[0]=0; A[3].letter[1]= 0; A[3].letter[2]= 2;
A[4].letter[0]=1; A[4].letter[1]= 0; A[4].letter[2]= 6;
A[5].letter[0]=2; A[5].letter[1]= 2; A[5].letter[2]= 6;
A[6].letter[0]=2; A[6].letter[1]= 5; A[6].letter[2]= 0;
A[7].letter[0]=1; A[7].letter[1]= 2; A[7].letter[2]= 6;
A[8].letter[0]=3; A[8].letter[1]= 7; A[8].letter[2]= 2;
A[9].letter[0]=0; A[9].letter[1]= 4; A[9].letter[2]= 7;
A[10].letter[0]=2; A[10].letter[1]= 1; A[10].letter[2]= 5; 
A[11].letter[0]=0; A[11].letter[1]= 3; A[11].letter[2]= 3;
 int idx[N];
 int i, h, n;

 n=12;
 for(i=0; i<n; i++)    idx[i]=i;
 radixsort(A, idx, n);
return(0);
}
void radixsort (struct word *A, int *idx, int n)
{
 int k;
 for(k=K-1; k>=0; k--) bucketsort(A, idx, n, k); 
 return;
}

void bucketsort(struct word *A, int *idx, int n, int k)
{
 struct cell *B[m]; 
 struct cell *p, *q;
 int i, j;

 for(j=0; j<m; j++) B[j]=NULL; 
 for(i=0; i<n; i++)               /* 文(1) */
     insert(A, idx[i], B, k);    /* 文(2) */
 i=n-1;
 for(j=m-1; j>=0; j--)
   {
    p=B[j];
    while(p != NULL) 
      {idx[i] = p->index; i=i-1; 
       q = p->next; free(p); p=q;}
   }
 return;
}
void insert(struct word *A, int ix, struct cell **B, int k)
{
 struct cell *p;

 p=(struct cell *)malloc(sizeof(struct cell));  
 p->index = ix;
 p->next = B[A[ix].letter[k]];
 B[A[ix].letter[k]] = p;
 return;
}


box
記事: 2002
登録日時: 13年前

Re: 一日悩んでます

#2

投稿記事 by box » 7年前

とりあえず、インデントをそろえてみませんか?
どこでそういうインデントの仕方を覚えましたか?
今のコードはとにかく見づらいです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 一日悩んでます

#3

投稿記事 by box » 7年前

そもそも、
るーたん さんが書きました:c++です。
C++に特有な文法を使っている形跡がありません。ふつうのC言語ではないのですか?
それから、提示されたコードは思いどおりに動いているのですか?
るーたん さんが書きました:

コード:

       q = p->next; free(p); p=q;}
freeしたpに何かを代入しているのは何かおかしい気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 一日悩んでます

#4

投稿記事 by みけCAT » 7年前

box さんが書きました:
るーたん さんが書きました:

コード:

       q = p->next; free(p); p=q;}
freeしたpに何かを代入しているのは何かおかしい気がします。
気のせいでしょう。
周りは読み込んでいないのでわかりませんが、この部分は線形リストを開放するときにはよくある処理で、不自然さは無いと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 一日悩んでます

#5

投稿記事 by みけCAT » 7年前

box さんが書きました:そもそも、
るーたん さんが書きました:c++です。
C++に特有な文法を使っている形跡がありません。ふつうのC言語ではないのですか?
特有の文法ではないですが、
  • int main(void)ではなくint main()を使っている
  • malloc関数の戻り値をわざわざキャストしている
という特徴から考えて、本当にC++を使っているかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yuni

Re: 一日悩んでます

#6

投稿記事 by yuni » 7年前

こんにちは。
1から別のものでならスタック操作のものキュー操作のものそれぞれ作れたのですが
この文章が気になっているんですが、
作れるなら普通に別々につくっていいのではないですか?
なにがそんなに苦しめているのかもどう苦しんでいるのかも
ちょっとわからないのですが…、どういう状況でしょうか?

閉鎖

“C言語何でも質問掲示板” へ戻る