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

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

 詳しくはこちら



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

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


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

No.20237

構造体
投稿者---トーマス(2005/03/06 13:53:06)


すいません。
構造体を用いて下記のプログラムにおいて初期化や追加や削除や表示を行いたいのですが、どのように書けばいいのでしょうか。
構造体を理解していないので、アドバイスをください。
#include <stdio.h>
#include <stdlib.h>

struct List {
    int element;
    struct List *next;
};

struct List *ListHead;
struct List *ListTail;

void initlist(void) {}      /* リストの初期化 */

void insertlist(int n) {}   /* リストの最後に追加 */

void deletelist(void) {}    /* リストの全削除 */

void printlist(void) {}     /* リストの全表示 */

int main (void) {

    char command = NULL;
    int  value;

    initlist();

    while ( command != 'Q' && command != 'q' ) {
        printf("input command ( h or H : help) -- ");
        scanf("%s", &command );

        switch ( command ) {
        case ('i'):
        case ('I'): 
            printf ("input value--");
            scanf ("%d", &value);
            insertlist (value);
            break;
        case ('d'):
        case ('D'):
            printf("delete list OK ? [Y(y)/N(n)] -- ");
            scanf ("%s", &command);
            if ( command == 'Y' || command == 'y' )
                deletelist ();
            else
                break;
            break;
        case ('p'):
        case ('P'):
            printlist();
            break;
        case ('h'):
        case ('H'):
            printf("i or I : insert, d or D : delete all, p or P : print list, q or Q : quit\n");
            break;   
        default:
            break;
        }
    }

    deletelist();
    free (ListHead);

    return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体 20238 Blue 2005/03/06 14:02:47
<子記事> Re:構造体 20246 Sophist 2005/03/06 22:20:49


No.20238

Re:構造体
投稿者---Blue(2005/03/06 14:02:47)


まず、ここの第15章 構造体 自己参照構造体を参考にしてみてはどうですか?

それでもわからない場合は出来るとこまでのソースを載せて再度具体的に質問してください。

# 掲示板ご利用上の注意はよく読みましょう。(環境(OSとコンパイラ)や症状は具体的に詳しく!)



この投稿にコメントする

削除パスワード

No.20246

Re:構造体
投稿者---Sophist(2005/03/06 22:20:49)


>構造体を理解していないので、アドバイスをください。

構造体(全般)を理解されていない状態で
今回提示された自己参照構造体を理解するのは、
ちょっとむずかしいかもしれません。

すでにご回答があったサイトをごらんになったり
書籍をお読みになったりするなどの方法で、
まずは構造体そのものの理解を深めることから
始めてみてはいかがでしょう。


この投稿にコメントする

削除パスワード

No.20251

Re:構造体
投稿者---とっぽ(2005/03/07 17:55:54)


あれから勉強してやってみたのですが、printの表示が思うようにできません。
どこが間違っているのでしょうか。

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

struct List {
    int element;
    struct List *next;
};

struct List *ListHead;
struct List *ListTail;

void initlist(void)       /* リストの初期化 */
{
  ListHead=ListTail = (struct List *)malloc(sizeof(struct List));
  ListTail->next = NULL;
}

void insertlist(int n)    /* リストの最後に追加 */
{
  struct List *ptr;
  ptr= (struct List*)malloc(sizeof(struct List));
  ptr->element=n;
  ListTail->next = ptr;
  ListTail = ptr;
  ListTail->next = NULL;
}

void deletelist(void)     /* リストの全削除 */
{
  struct List *ptr;
  struct List *ptr2;
  ptr=ListHead->next;

  while(ptr!=ListTail){
   ptr2=ptr->next;
   free(ptr);
   ptr=ptr2;
  }

  free(ListTail);
  ListTail=ListHead;
}

void printlist(void)      /* リストの全表示 */
{
  struct List *ptr;
  struct List *ptr2;
  ptr=ListHead->next;

  while(ptr!=ListTail){
    ptr2=ptr->next;
    printf("%s\n", ptr);
    ptr=ptr2;
  } 

  free(ListTail);
  ListTail=ListHead;
}

int main (void) {

    char command = NULL;
    int  value;

    initlist();

    while ( command != 'Q' && command != 'q' ) {
        printf("input command ( h or H : help) -- ");
        scanf("%s", &command );

        switch ( command ) {
        case ('i'):
        case ('I'): 
            printf ("input value--");
            scanf ("%d", &value);
            insertlist (value);
            break;
        case ('d'):
        case ('D'):
            printf("delete list OK ? [Y(y)/N(n)] -- ");
            scanf ("%s", &command);
            if ( command == 'Y' || command == 'y' )
                deletelist ();
            else
                break;
            break;
        case ('p'):
        case ('P'):
            printlist();
            break;
        case ('h'):
        case ('H'):
            printf("i or I : insert, d or D : delete all, p or P : print list, q or Q : quit\n");
            break;   
        default:
            break;
        }
    }

    deletelist();
    free (ListHead);

    return 0;
}



この投稿にコメントする

削除パスワード

No.20252

Re:構造体
投稿者---shu(2005/03/07 18:18:09)


>あれから勉強してやってみたのですが、printの表示が思うようにできません。

「思うように」とは、どういうことなのかご自分で考えて明確にしてみてください。
明確になった上で、そのとおりにプログラムが組まれているかどうか、確かめてください。

>どこが間違っているのでしょうか。

いろいろと間違っていますので、どこと限定は出来ません。
コンパイルがとおれば、それで良いというものでもありません。


この投稿にコメントする

削除パスワード

No.20253

Re:構造体
投稿者---通りすがり(2005/03/07 18:21:32)


もっと具体的に質問してください。

どこの何がどのような結果になりますか?
該当部分に対してどのようなデバッグを行いましたか?
結果についてどのように考えていますか?

ソースを提示するからすべて読んで、
環境作ってコンパイルして動かしてどこが悪いか発見して回答してくれ、
ということでしょうか。
質問の仕方も勉強してみてください。



この投稿にコメントする

削除パスワード

No.20254

Re:構造体
投稿者---Sophist(2005/03/07 19:35:40)


>あれから勉強してやってみたのですが、printの表示が思うようにできません。

ソースを拝見したところ、表示だけでなく初期化・最後に追加・全削除の
いずれも正しくありません。



この投稿にコメントする

削除パスワード

No.20257

Re:構造体
投稿者---トーマス(2005/03/07 20:20:37)


>>あれから勉強してやってみたのですが、printの表示が思うようにできません。
>
>ソースを拝見したところ、表示だけでなく初期化・最後に追加・全削除の
>いずれも正しくありません。

すいません。
できました。
初期化とかはあってました。
表示で変数を間違えてしまいました。
どうもありがとうございました。


この投稿にコメントする

削除パスワード

No.20260

Re:構造体
投稿者---Sophist(2005/03/07 21:02:18)


>初期化とかはあってました。

あってました、とおっしゃるのは20251のソースコードが、ですか?
初期化のところを例に挙げると、「headのnextがゴミのままで
本当にいいのか?」という疑問があります。
追加や削除にも、疑問点がありました。中には、実行すると無限ループに
陥ってしまうような問題もありました。

あってました、というのが、そういった疑問点をすべてクリアされた、
ということでしたらかまいません。

しかし、表示のところだけに手を入れてそれでよし、ということでしたら、
それはいかがなものかと思います。
まあそうは言っても、ご本人が「できました」と書かれている以上、
私なんかが深入りするようなことではないかもしれません。


この投稿にコメントする

削除パスワード

No.20273

Re:構造体
投稿者---REE(2005/03/08 13:26:23)


>>初期化とかはあってました。
>
>あってました、とおっしゃるのは20251のソースコードが、ですか?
>初期化のところを例に挙げると、「headのnextがゴミのままで
>本当にいいのか?」という疑問があります。

ここは問題ないですよ、headのnextとtailのnextは同一ですので、ゴミのままにはなっていません。

>追加や削除にも、疑問点がありました。中には、実行すると無限ループに
>陥ってしまうような問題もありました。

追加についても分かりにくいとはいえ、特に動作的な問題は見当たりませんでした。

全削除については初期化直後に実行すると、落ちそうですね。



この投稿にコメントする

削除パスワード

No.20279

Re:構造体
投稿者---Sophist(2005/03/08 20:20:53)


>ここは問題ないですよ、headのnextとtailのnextは同一ですので、ゴミのままにはなっていません。

おっしゃるとおりです。
malloc()の戻り値を検査していないという点を除けば大丈夫です。


この投稿にコメントする

削除パスワード

No.20285

Re:構造体
投稿者---トーマス(2005/03/09 09:22:56)


>>>初期化とかはあってました。
>>
>>あってました、とおっしゃるのは20251のソースコードが、ですか?
>>初期化のところを例に挙げると、「headのnextがゴミのままで
>>本当にいいのか?」という疑問があります。
>
>ここは問題ないですよ、headのnextとtailのnextは同一ですので、ゴミのままにはなっていません。
>
>>追加や削除にも、疑問点がありました。中には、実行すると無限ループに
>>陥ってしまうような問題もありました。
>
>追加についても分かりにくいとはいえ、特に動作的な問題は見当たりませんでした。
>
>全削除については初期化直後に実行すると、落ちそうですね。

初期化直後に実行した後、落ちないようにするにはどうしたらよいでしょうか。


この投稿にコメントする

削除パスワード

No.20287

Re:構造体
投稿者---REE(2005/03/09 10:05:43)


>>全削除については初期化直後に実行すると、落ちそうですね。
>
>初期化直後に実行した後、落ちないようにするにはどうしたらよいでしょうか。

printlistはdeletelistを元に作られているためか、非常に似ています。
printlistを直すことが出来たのであれば、deletelistも同様に直せると思われます。



この投稿にコメントする

削除パスワード

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