ページ 1 / 1
ダブルリンクリストの問題
Posted: 2010年6月24日(木) 02:29
by モンティニオ
【質問】
[1] 授業単元: データ構造
[2] 問題文
http://kansai2channeler.hp.infoseek.co. ... /10739.txt
[3] 環境
[3.1] OS: WindowsXP
[3.3] 言語: C言語
[4] 期限: 6月24日
よろしくお願いします。
Re:ダブルリンクリストの問題
Posted: 2010年6月24日(木) 02:32
by モンティニオ
問題文が表示されないので添付ファイルでアップしました
どうかよろしくお願いします。
Re:ダブルリンクリストの問題
Posted: 2010年6月24日(木) 02:34
by y
利用規約を読んだのかは分かりませんが、質問になってませんよ。
丸投げ、質問の仕方も含めて、もう一度よく利用規約を読みましょう。
Re:ダブルリンクリストの問題
Posted: 2010年6月24日(木) 10:52
by dic
ザッとしか見てませんが
ほとんどできてるようです
どこが問題なのでしょうか?
Re:ダブルリンクリストの問題
Posted: 2010年6月24日(木) 12:14
by toyo
これは2ちゃんねるの宿題丸投げスレのテンプレートとアップローダですよね
ここで質問するならここの規約も読んでおいてください
Re:ダブルリンクリストの問題
Posted: 2010年6月25日(金) 16:52
by dic
#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:ダブルリンクリストの問題
Posted: 2010年6月25日(金) 17:30
by たかぎ
「注目セル」と「着目セル」は同義なのか別なのかなど、読み取れない情報が少なからずあります。
結局どうしたいのかをもっと明確にすべきです。
Re:ダブルリンクリストの問題
Posted: 2010年6月25日(金) 18:20
by dic
#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;
}
サクッとつくりました
末尾の削除が期待したとおりに動きませんが
サンプルほどできてるのに
何がわからないのかが わからない状態です