掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

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

No.28730

メモリの動的確保(ファイルから数値を読み込み構造体にする)
投稿者---輝亜(2006/11/05 01:11:54)


はじめまして。

学生で学校の課題に悩んでおります;;

『実数型の数値だけが何十行も書かれたテキストファイルを構造体に読み込んで、メモリはmalloc 関数を使って動的確保して、最後に一気に表示する』
というものです。

ファイルはほんとに下記の様に数字が何行にもなってるだけです。

*********************************
12
432
5
73
*********************************

pptに解説らしきものが載ってるのですがそちらも載せておきます。

『先頭のダミー要素のアドレスを格納するヘッダ hd を作成し,動的確保よってダミー要素を作成する。
番兵となる要素のアドレスを格納する tail を作成し,動的確保によって番兵要素を作成する。
番兵要素のアドレス部(tail->next)には NULL (アルゴリズムでは nil)を入れておく。
ダミー要素のアドレス部(hd->next)には番兵要素のアドレス(tail)を代入しておく。
新しい要素のアドレスを格納するポインタ n を作成し,動的確保を行う。
挿入したい場所の直前の要素のアドレスをポインタ p に代入する。
ポインタ n が示す要素のアドレス部(n->next)に,ポインタ p が示す要素の次の要素のアドレス(p->next)を代入する。
ポインタ p が示す要素の次の要素のアドレス(p->next)に,ポインタ n (新しい要素のアドレス)を代入する。
ポインタ p にダミー要素の次の要素のアドレス(hd->next)を代入しておく。
ポインタ p が示す要素の次の要素のアドレス(p->next)が NULL(アルゴリズムでは nil)になるまで次のことを繰り返す。
p が示すアドレスにある要素の内容を表示(例:p->name,p->height 等)
p に p が示す要素の次の要素のアドレス(p->next)を代入する。』

読んでも理解不能なんです・・・。


ファイルを読み込みながら1行ずつ表示するのはダメだそうで・・・。

自分でもぐちゃぐちゃでよくわからなくなってしまったんですが、作りかけのソースです・・・。お役に立てるとは思えませんが。。。苦

よろしかったらアドバイスお願いします。
特にコメントアウトしたところがさっぱりよくわからないです;;




#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct body{
        double test;
        struct body *next;
}BODY;
int main( void)
{
        FILE *fp;
        BODY *n,*tail,*hd,*p;
        int i,j;

        if(NULL == (fp = fopen("test3.txt","r"))){
                printf("fail!\n");
                return 1;
        }

        tail->next = NULL;
        hd->next = tail;

//      n = ( BODY *)malloc(sizeof( BODY));
//
//      n->
//
//      for(i=0; EOF != fscanf(fp, "%d", &BODY.test); i++){
//            
//            
//            
//      }
//
                free(n);


        p = hd->next;
        for(j=0; p->next!=NULL; j++){
                printf("No.%-5d%d\n", j+1,p->key);
                p = p->next;
        }
}







この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:メモリの動的確保(ファイルから数値を読み込み構造体にする) 28736 RAPT 2006/11/05 01:48:05


No.28736

Re:メモリの動的確保(ファイルから数値を読み込み構造体にする)
投稿者---RAPT(2006/11/05 01:48:05)


構造体には違いないですが、アルゴリズムとしては、リストを使う問題ですね。

> tail->next = NULL;
> hd->next = tail;
ポインタは必ず領域を確保してから使いましょう。

で、そのパワーポイントの解説とやらは単にソースコードを和文にしただけのようですね。
そのまま読んでも意味不明でしょう。

とりあえず、リストは置いておいて、静的配列を使って下記のことができるでしょうか。
  1. ファイルを開く
  2. データを読み取る
  3. メモリに記憶する
  4. データが終端するまで2〜3を繰り返す
  5. ファイルを閉じる
  6. 記憶したデータを表示する
その上で、リストで代替させるという手順の方がわかりやすいかもしれません。



この投稿にコメントする

削除パスワード

No.28755

Re:メモリの動的確保(ファイルから数値を読み込み構造体にする)
投稿者---輝亜(2006/11/05 22:23:02)


返信ありがとう御座います;;

このレスを見る前に自分的に動的確保らしきものが出来てるようなプログラムが書けたので見てみてくださいm(_ _)m

読み込み用のテキストファイルです。↓↓
::::::::::::::::::::::::::::::::::::
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
::::::::::::::::::::::::::::::::::::

ソースコードです。↓↓
********************************************
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct body{
    int test;
    struct body *next;
}BODY;
int main( void)
{
    FILE *fp;
    BODY *n,*tail,*hd,*p;
    int i,j,work;

    if(NULL == (fp = fopen("test3.txt","r"))){
        printf("fail!\n");
        return 1;
    }

    hd = ( BODY *)malloc(sizeof( BODY));
    tail = ( BODY *)malloc(sizeof( BODY));

    tail->next = NULL;
    hd->next = tail;

    for(i=0; EOF != fscanf(fp, "%d", &work); i++){
        n = ( BODY *)malloc(sizeof( BODY));
        n->test = work;
        p = hd;
        n->next = p->next;
        p->next = n;
    }

    p = hd->next;

    for(j=0; p->next!=NULL; j++){
        printf("No.%-5d%d\n", j+1,p->test);
        p = p->next;
    }

    free(n);
    free(hd);
    free(tail);

    return 0;
}

********************************************

でもこれだと、下記のようになってしまうんですよね・・・。

No.1 20
No.2 19
No.3 18
No.4 17
No.5 16
No.6 15
No.7 14
No.8 13
No.9 12
No.10 11
No.11 10
No.12 9
No.13 8
No.14 7
No.15 6
No.16 5
No.17 4
No.18 3
No.19 2
No.20 1
Press any key to continue


逆だぁーーーーーーーーーー・・・・・・・・・・orz



この投稿にコメントする

削除パスワード

No.28759

Re:メモリの動的確保(ファイルから数値を読み込み構造体にする)
投稿者---KING・王(2006/11/06 01:41:00)


詳しく見ていませんが、とりあえず、
    for(i=0; EOF != fscanf(fp, "%d", &work); i++){
        n = ( BODY *)malloc(sizeof( BODY));
        n->test = work;
        p = hd;
        n->next = p->next;
        p->next = n;
    }

の中の、
p = hd;
で、毎回最初に確保されたhdを用いていますが、これが問題では?



この投稿にコメントする

削除パスワード

No.28769

Re:メモリの動的確保(ファイルから数値を読み込み構造体にする)
投稿者---輝亜(2006/11/06 23:40:06)


こんばんわ。
アドバイスありがとうございます。

一応の形として実行結果は希望通りになりましたwww
ただあんまり綺麗なプログラムになっていない気がするのですが・・・。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct body{
    int test;
    struct body *next;
}BODY;
int main( void)
{
    FILE *fp;
    BODY *n,*hd,*p;
    int i=0,work=0;

    if(NULL == (fp = fopen("test3.txt","r"))){
        printf("fail!\n");
        return 1;
    }

    p = ( BODY *)malloc(sizeof( BODY));
    hd = p;

    for(i=0; EOF != fscanf(fp, "%d", &work); i++){
        n = ( BODY *)malloc(sizeof( BODY));
        n->test = work;
        p->next = n;
        n->next = NULL;
        p = n;
    }

    fclose(fp);

    p = hd;
    p = p->next;

    i=0;

    do{
        printf("No.%-5d%d\n", i+1 ,p->test);
        p = p->next;
        i++;
    }while(p->next!=NULL);
    
    printf("No.%-5d%d\n", i+1 ,p->test);

    free(n);

    return 0;
}



これだと何となく出来てるんですけど、表示部分がスマートじゃないプログラムですよね・・・・・・・・。

まぁでもコレで良いのでしょうかね。笑



この投稿にコメントする

削除パスワード

No.28770

Re:メモリの動的確保(ファイルから数値を読み込み構造体にする)
投稿者---かずま(2006/11/07 02:34:35)


> これだと何となく出来てるんですけど、表示部分がスマートじゃないプログラムですよね・・・・・・・・。
>
> まぁでもコレで良いのでしょうかね。笑

malloc と free が対応していませんよ。
#include <stdio.h>
#include <stdlib.h>

typedef struct body { int test; struct body *next; } BODY;

int main(void)
{
    BODY hd = { 0 }, *p, *q;   int i;

    for (p = &hd; scanf("%d", &i) == 1; p = p->next = q) {
        q = malloc(sizeof *q);
        if (!q) puts("out of memory"), exit(1);
        q->test = i;
        q->next = NULL;
    }

    for (i = 0, p = hd.next; p; p = p->next)
        printf("No.%-5d%d\n", ++i, p->test);
    
    for (p = hd.next; p; p = q)
        q = p->next, free(p);

    return 0;
}



この投稿にコメントする

削除パスワード

No.28772

Re:メモリの動的確保(ファイルから数値を読み込み構造体にする)
投稿者---輝亜(2006/11/07 17:56:20)


わぁーーーwww
有難うございます!!!!!
すごくスマートなプログラムになってますねー。
コレ見てもう一回勉強し直します。

私のプログラムを見てコメントしてくださった皆様、有難うございました!!


この投稿にコメントする

削除パスワード

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