ダブルリンクリストの問題

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

ダブルリンクリストの問題

#1

投稿記事 by モンティニオ » 15年前

【質問】
[1] 授業単元: データ構造
[2] 問題文 http://kansai2channeler.hp.infoseek.co. ... /10739.txt
[3] 環境
 [3.1] OS: WindowsXP
 [3.3] 言語: C言語
[4] 期限: 6月24日
よろしくお願いします。

モンティニオ

Re:ダブルリンクリストの問題

#2

投稿記事 by モンティニオ » 15年前

問題文が表示されないので添付ファイルでアップしました
どうかよろしくお願いします。

y

Re:ダブルリンクリストの問題

#3

投稿記事 by y » 15年前

利用規約を読んだのかは分かりませんが、質問になってませんよ。
丸投げ、質問の仕方も含めて、もう一度よく利用規約を読みましょう。

dic

Re:ダブルリンクリストの問題

#4

投稿記事 by dic » 15年前

ザッとしか見てませんが
ほとんどできてるようです

どこが問題なのでしょうか?

toyo

Re:ダブルリンクリストの問題

#5

投稿記事 by toyo » 15年前

これは2ちゃんねるの宿題丸投げスレのテンプレートとアップローダですよね
ここで質問するならここの規約も読んでおいてください

dic

Re:ダブルリンクリストの問題

#6

投稿記事 by dic » 15年前

#include <stdio.h>
#include <stdlib.h>
#define    SIZE    10

static    int    gData[SIZE];

void    reset()
{
    int    i;
    for( i=0; i<SIZE; i++ )
        gData = 0;
}

///////////////////////////////////////////////
void    module000()
{
    char    b[80];
    printf( "入力する数字:" );
    fgets( b, 80, stdin );

    int    i = atoi(b);

again:
    printf( "入力する位置 0-9\n" );
    fgets( b, 80, stdin );
    int    j = atoi(b);
    if( (j<0) || (j>9) )
    {
        printf( "入力する位置が不適切です\n" );
        goto again;
    }

    gData[j] = i;
}

///////////////////////////////////////////////////////
void    module001()
{
again2:
    printf( "削除する位置を指定してください 0 - 9\n" );

    char    b[80];
    fgets( b, 80, stdin );
    
    int    i = atoi(b);

    if( (i<0) || (i>9) )
    {
        printf( "削除する位置が不適切です\n" );
        goto again2;
    }

    gData = -1;
}


/////////////////////////////////////////////////////
void    module002()
{
    printf( "現在の状態\n" );

    int    i;
    for( i=0; i<SIZE; i++ )
        printf( "%3d ", gData );
    printf( "\n" );
}

///////////////////////////////////////////////////
int    main()
{
    reset();    //    初期化

    char    b[80];

    while( b[0] != '9' )
    {
        printf( "命令を入力してください\n" );
        printf( "0 - 数字を入力\n" );
        printf( "1 - 数字の削除\n" );
        printf( "2 - 現在の状態を見る\n" );
        printf( "9 - 終了\n" );

        fgets( b, 80, stdin );

        if( b[0] == '0' )
            module000();
        else if( b[0] == '1' )
            module001();
        else if( b[0] == '2' )
            module002();
    }

    return 0;
}

固定配列バージョンを10分でつくりました
期限はすぎてるようですが
どうでしょうか?


基本情報処理試験にも双方向リストの問題はよくでますね
時間あるときに再思考してみます
画像

たかぎ

Re:ダブルリンクリストの問題

#7

投稿記事 by たかぎ » 15年前

「注目セル」と「着目セル」は同義なのか別なのかなど、読み取れない情報が少なからずあります。
結局どうしたいのかをもっと明確にすべきです。

dic

Re:ダブルリンクリストの問題

#8

投稿記事 by dic » 15年前

#include <stdio.h>
#include <stdlib.h>

#define    SIZE    10

typedef    struct    cell
{
    struct    cell    *next;
    struct    cell    *prev;
    int        val;
} cell;

static    cell    gCell[10];
static    cell    *first;
static    int        yuukou;

///////////////////////////////////////////////////////////
void    init()
{
    int    i;
    for( i=0; i<SIZE-1; i++ )
        gCell.next = &gCell[i+1];
    gCell[SIZE-1].next = NULL;

    for( i=1; i<SIZE; i++ )
        gCell.prev = &gCell[i-1];
    gCell[0].prev = NULL;

    for( i=0; i<SIZE; i++ )
        gCell.val = i*10;
}
///////////////////////////////////////////////////////////
void    print()
{
    printf( "gCellの中身: " );
    cell    *p = first;

    while( p != NULL )
    {
        printf( "%3d ", p->val );
        p = p->next;
    }
    printf( "\n" );
}
///////////////////////////////////////////////////////////
//    数字を追加する
//        val:    追加する数字
//        list:    追加するリスト
//
void    add( int val )
{
    char    mes[80];
    sprintf( mes, "%d を追加\n", val );
    printf( mes );

    //    追加する場所を探す
    cell    *p = first;
    while( p->next != NULL )
    {
        if( p->val <= val )
            p = p->next;
        else
        {
            p->val = val;
            break;
        }
    }
}
////////////////////////////////////////////////////////////
//    数字を削除する
//        out:    削除する場所 0 - 9
void    remove( int out )
{
    if( first == NULL )
        return;

    char    mes[80];
    sprintf( mes, "%d を削除\n", out );
    printf( mes );

    //    削除する数字を探す
    cell    *p = first;
    //    削除するのがラストの場合
    if( yuukou == 1 )
    {
        if( p->val == out )
        {
            first = NULL;
            p->next = NULL;
            p->prev = NULL;
            yuukou = 0;
        }
    }

    while( p->next != NULL )
    {
        if( p->val == out )
        {
            //    削除するのが先頭の場合
            if( p->prev == NULL )
            {
                first = p->next;
                (p->next)->prev = NULL;
            }
            //    削除するのが末尾の場合
            else if( p->next == NULL )
            {
                (p->prev)->next = NULL;
            }
            //    通常の場合
            else
            {
                (p->prev)->next = p->next;
                (p->next)->prev = p->prev;
            }
            p->val = -1;
            p->next = NULL;
            p->prev = NULL;
            yuukou -= 1;
        }
        else
            p = p->next;
    }
}

////////////////////////////////////////////////////////////
int main()
{
    printf( "---初期状態---\n" );
    first = &gCell[0];
    yuukou = SIZE;
    init();
    print();

    add( 22 );
    print();

    remove( 22 );
    print();

    remove( 60 );
    print();
    remove( 70 );
    print();
    remove( 80 );
    print();
    remove( 90 );
    print();
    remove( 90 );
    print();
    remove( 90 );
    print();

    print();

    return 0;
}

サクッとつくりました
末尾の削除が期待したとおりに動きませんが
サンプルほどできてるのに
何がわからないのかが わからない状態です

閉鎖

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