連結リストにおける大小比較をしながらデータ入力をする際のコードに関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hikarusakuyo
記事: 1
登録日時: 11年前

連結リストにおける大小比較をしながらデータ入力をする際のコードに関して

#1

投稿記事 by hikarusakuyo » 11年前

今、大学の課題で連結リストを用いた電話帳プログラムを作っています。
その際の条件の一つとして、「データ入力をする際は大小比較を行いながら入れる場所を探して入れるようにする。つまり、常に昇順にソートされた状態にすること」というものがあり、それを今は行っている途中です。
しかし、私が作ったコードでは、おそらくppの初期値設定が原因で上手く動いてくれません。
具体的にはセグメンテーションエラーが出ます。
これはNULLが最初にppに入るからだと思いますが、代替案が浮かばなかったので、質問させて頂きました。
また、コードは質問の対象である入力関数しか示していませんが、実際は削除関数、検索関数、表示関数、終了関数が含まれています。
コード中ではコメントアウトでいっぱい説明させていただきました。

コード:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define PB 20

typedef struct pbook
{
        char name[PB];
        char tel[PB];
        struct pbook *next;
}
pbook;

void input( void );
void reference( void );
void delete( void );
void show( void );
void end( void );

pbook *head;

int main( void )
{
        char num[1] = "a";
        int esc = 2;

        head = NULL;

        do
        {
                printf( "コマンドを選んでください\n" );
                printf( "i:入力,d:削除,s:検索,p:表示,e:終了\n" );
                scanf("%s", num );

                /*strcmpを使った場合分け処理*/
                if( strcmp( num, "i" ) == 0 )
                {
                        esc = 1;
                        input();
                }
                else if( strcmp( num, "d" ) == 0 )
                {
                        esc = 2;
                        delete();
                }
                else if( strcmp( num, "s" ) == 0 )
                {
                        esc = 3;
                        reference();
                }
                else if( strcmp( num, "p" ) == 0 )
                {
                        esc = 4;
                        show();
                }
                else if( strcmp( num, "e") == 0 )
                {
                        esc = 6;
                        end();
                }
        }
        while( esc < 5 );

        return 0;
}

/*入力関数*/
void input( void )
{
        struct pbook *pp;
        struct pbook *pb;
        struct pbook *new;

        new = ( struct pbook * ) malloc ( sizeof( struct pbook ) );

        if( new == NULL )       /*メモリが確保出来たか調べるif文*/
        {
                printf( "メモリを確保出来なかった\n" );
                return;
        }

        printf( "名前の入力\n" );
        scanf( "%s" , new->name );

        printf( "電話番号の入力\n" );
        scanf( "%s" , new->tel );

        new->next = NULL;
        pb = head;              /*pbとppの初期設定 pbは常に1つ前を指す ppはデータの大小比較で用いる*/
        pp = pb->next;          /*ppをどのように初期設定すればよいか分からない*/

        if( head == NULL )      /*レコードなしかどうか調べるif文*/
        {
                head = new;     /*head書き換えで追加するコード*/
        }

        /*else if( pb == NULL )         レコード1つ以上かつ、先頭に追加するかどうか調べるif文(最初はこれで、
一つ前を指しているpb==NULLの時に・・・という条件にしていましたが、どうにもこうにも上手くいきそうになかったので、
下にあるものに切り替えました。しかし、先生からのヒントではこの条件文を示されていました)*/
        else if( strcmp( head->name, new->name ) > 0 )  /*レコード1つ以上のとき、先頭を大小比較するif文*/
        {
                new->next = head;       /*先頭に追加するコード*/
                head = new;
        }

        else
        {
                for( pp = head; pp == NULL; pp = pp->next )     /*ppがNULLになるまでppにpp->nextを入れ続け繰り返すfor文*/
                {
                        if( strcmp( pp->name, new->name ) > 0 ) /*名前の大小を比べ、ppがnewよりも大きい時*/
                        {
                                new->next = pb->next;           /*ひとつ前を指しているpbを使って、中間にnewを入れるコード*/
                                pb->next = new;
                                return;                         /*とりあえずループ脱出用*/
                        }

                        else if( strcmp( pp->name, new->name ) <= 0 )   /*名前の大小を比べ、ppがnewよりも小さい時*/
                        {
                                pb = pp;                                /*次のデータを調べるためにpbとppの値を更新するコード*/
                                pp = pp->next;
                        }
                }
        }

}

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