【質問】
[1] 授業単元: データ構造
[2] 問題文 http://kansai2channeler.hp.infoseek.co. ... /10739.txt
[3] 環境
[3.1] OS: WindowsXP
[3.3] 言語: C言語
[4] 期限: 6月24日
よろしくお願いします。
ダブルリンクリストの問題
Re:ダブルリンクリストの問題
#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:ダブルリンクリストの問題
#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; }
サクッとつくりました
末尾の削除が期待したとおりに動きませんが
サンプルほどできてるのに
何がわからないのかが わからない状態です