【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19219

挿入法によるリストの整列
投稿者---たら(2005/01/15 16:47:54)


プロトタイプ宣言とメイン関数を載せておきます。リストに対する
挿入法のアルゴリズムがよくわからないためins_sort()が作れません。
どなたか教えていただけないでしょうか。他の関数はできているため
省きました。
#include <stdio.h>
#define LISTDATA1 1
#define LISTDATA2 23
#define LISTDATA3 3
#define LISTDATA4 125
#define LISTDATA5 4
#define LISTDATA6 8
#define LISTDATA7 5
#define LISTDATA8 76

struct cell {
  int data;
  struct cell *link;
};

void ins_sort(struct cell *);  
void init_list(struct cell *);/*リストのデータを初期設定する*/
void print_list(struct cell *, int, int );/*リストを表示*/
void insert( struct cell *, int, int );/*リストに新しいセルを挿入*/
struct cell *getcell();/*セルの領域を確保してポインタを返す*/
struct cell *create(); /*空のリストを作成しポインタを返す*/

int main(void)
{
  struct cell *list;
  int data;

  list = create();
  init_list(list);
  printf("InitialList:");
  print_list(list);
  ins_sort(list);
  return 0;
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:挿入法によるリストの整列 19220 ぽへぇ 2005/01/16 06:38:03
<子記事> Re:挿入法によるリストの整列 19221 επιστημη 2005/01/16 06:41:59


No.19220

Re:挿入法によるリストの整列
投稿者---ぽへぇ(2005/01/16 06:38:03)


>他の関数はできているため省きました。
本当ですか?

プロトタイプ
>void print_list(struct cell *, int, int );/*リストを表示*/
に対し、

呼び出し
>print_list(list);
というのは変でしょう。

さて、 ins_sort(list) も list に対し、どういう処理をするのか
わからないと書きようがないですね。

void insert( struct cell *, int, int );
と何か関連はありますか?




この投稿にコメントする

削除パスワード

No.19222

Re:挿入法によるリストの整列
投稿者---たら(2005/01/16 11:33:06)


>プロトタイプ
>>void print_list(struct cell *, int, int );/*リストを表示*/
>に対し、
>
>呼び出し
>>print_list(list);
>というのは変でしょう。
すみません。そこは書き間違えていたみたいです。後のint二つはありませんでした。

>さて、 ins_sort(list) も list に対し、どういう処理をするのか
>わからないと書きようがないですね。
この関数の引数はリストの先頭を示すポインタです。関数内のアルゴリズムとしては以下のようにしたいです。
1.c1をリストの1番目のセルを示すポインタにする
2.c2をリストの0番目(ダミー)のセルを示すポインタにする
3.c2=c1となるか、c2の次のセルの値>c1の次のセルの値となるまでc2を次のセルへと移動
4.c2=c1ならc1をひとつ右に移動、c2=c1でなければc1の次のセルをc2の後ろのセルに挿入
5.c1 リスト末尾になるまで2.3.4を繰り返す。 

>void insert( struct cell *, int, int );
>と何か関連はありますか?
この関数はinit_listでリストデータを初期設定するとき使用しました。おそらく関連はないと思います。




この投稿にコメントする

削除パスワード

No.19223

Re:挿入法によるリストの整列
投稿者---monkey(2005/01/16 13:31:51)


> この関数の引数はリストの先頭を示すポインタです。
> 関数内のアルゴリズムとしては以下のようにしたいです。

「リストの先頭」というのが、ダミーのセルを指すのか、実際のリストの先頭を指すのかによって若干異なりますが、
前者の場合であるならば次のようになるでしょう。

void ins_sort( struct cell* list )
{
    // 1. c1をリストの1番目のセルを示すポインタにする
    struct cell* c1 = 「1番目のセルを指すポインタ」;

    // 5. c1 リスト末尾になるまで2.3.4を繰り返す。
    while( 「c1 がリストの末尾でない」 ){

        // 2. c2をリストの0番目(ダミー)のセルを示すポインタにする
        struct cell* c2 = 「0番目のセルを指すポインタ」;

        // 3. c2=c1となるか、c2の次のセルの値>c1の次のセルの値となるまでc2を次のセルへと移動
        while( 「c2->data と c1->data が等しくない,かつ, c2->link->data が c1->link->data 以下」 ){
            c2 = 「c2の次のセルを指すポインタ」;
        }

        // 4-1. c2=c1ならc1をひとつ右に移動、
        if( 「c2->data と c1->data が等しい」 ){
            c1 = 「c1の次のセルを指すポインタ」;
        }

        // 4-2. c2=c1でなければc1の次のセルをc2の後ろのセルに挿入
        else{
            struct cell* ct = 「c1の次のセルを指すポインタ」;
            「c1の次のセル(ct)をリストから削除」※c1->linkがc1の"次の次"のセルを指すように変更する
            「ctをc2の直後に挿入」※πιστημηさんのコメント参照.
        }
    }
}



この投稿にコメントする

削除パスワード

No.19229

Re:挿入法によるリストの整列
投稿者---たら(2005/01/16 16:31:07)


非常に細かい説明ありがとうございます。一度試してみたいと思います。
本当に助かりました。


この投稿にコメントする

削除パスワード

No.19221

Re:挿入法によるリストの整列
投稿者---επιστημη(2005/01/16 06:41:59)


> リストに対する挿入法のアルゴリズムがよくわからないためins_sort()が作れません。

struct cell* x;
struct cell* y;

x の'直後'に y を挿入するには:

y->link = x->link;
x->link = y;



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧