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

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

 詳しくはこちら


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

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


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

No.22021

自己構造体
投稿者---neko(2005/07/21 14:04:49)


こちらのサイトの自己構造体をコンパイルしてみましたが、
最後に入力したものが表示されません。
なぜでしょうか?
リスト表示の関数部分に下記を追加すると最後に入力したリストは表示されますが、このプリント文は表示されません。
printf("p%d\n", p);
検索してもヒットせず分かりませんでしたのでよろしくお願いします。
環境はWin98です。


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

struct list {
int key; /* キー */
char name[20]; /* 名前 */
struct list *next; /* 次のデータへのポインタ */
};

struct list *add_list(int key, char *name, struct list *head);
void show_list(struct list *p);
void free_list(struct list *p);

int main(void)
{
struct list *head; /* 先頭ポインタ */
char name[20];
int key = 0;

head = NULL; /* 先頭ポインタにNULLを設定 */

printf("キーと名前(MAX:19文字)を入力(終了:CTRL+Z)\n");
while (scanf("%d %s", &key, name) != EOF) {
/* リストにデータを登録 */
head = add_list(key, name, head);
}
printf("リストの表示%d",head);
/* リストの表示 */
show_list(head);
printf("リストの開放%d",head);

/* リストの開放 */
free_list(head);

return 0;
}

/*** リストにデータを登録 ***/
struct list *add_list(int key, char *name, struct list *head)
{
struct list *p;

/* 記憶領域の確保 */
if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) {
printf("malloc error\n");
exit(1);
}

/* リストにデータを登録 */
printf("head%d\n", head);
p->key = key;
printf("add_list_key%d\n",p->key);
strcpy(p->name, name);
printf("add_list_name%s\n",p->name);

/* ポインタのつなぎ換え */
p->next = head; /* 今までの先頭ポインタを次ポインタに */
printf("add_list_p->next%d\n",p->next);
head = p; /* 新たな領域を先頭ポインタに */
printf("add_list_head%d\n",head);

return head;
}

/*** リストの表示 ***/
void show_list(struct list *p)
{
while (p != NULL) { /* 次ポインタがNULLまで処理 */
//printf("p%d\n", p);

printf("%3d %s\n", p->key, p->name);
p = p->next;
}
}

/*** リストの開放 ***/
void free_list(struct list *p)
{
struct list *p2;

while (p != NULL) { /* 次ポインタがNULLまで処理 */
p2 = p->next;
printf("p2=%d\t",p2);
printf("free p=%d\t",p);
free(p);
p = p2;
printf("p=%d\t",p);
}
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:自己構造体 22022 あかま 2005/07/21 14:32:49
<子記事> Re:自己構造体 22030 shu 2005/07/21 17:58:54


No.22022

Re:自己構造体
投稿者---あかま(2005/07/21 14:32:49)


>こちらのサイトの自己構造体をコンパイルしてみましたが、
http://www9.plala.or.jp/sgwr-t/c/sec15-5.html
このページのプログラムですか?

プログラムを貼り付けるときは必ず「HTML変換ツール」を使ってください。
読めないです。

あと自己参照構造体が正しいです。

>最後に入力したものが表示されません。
>なぜでしょうか?
自己参照構造体のページに載っている改造前のプログラムを実行してみましたが、

------ここから----------
キーと名前(MAX:19文字)を入力(終了:CTRL+Z)
123 kkk
234 aaa
^Z
234 aaa
123 kkk
 -- Press any key to exit (Input "c" to continue) --
--------ここまで--------

投稿されたプログラムを実行してみましたが、

--------ここから-----------
キーと名前(MAX:19文字)を入力(終了:CTRL+Z)
1232 kkk
head0
add_list_key1232
add_list_namekkk
add_list_p->next0
add_list_head9447840
234 abc
head9447840
add_list_key234
add_list_nameabc
add_list_p->next9447840
add_list_head9447872
^Z
リストの表示9447872234 abc
1232 kkk
リストの開放9447872p2=9447840   free p=9447872  p=9447840       p2=0    free p=9
447840  p=0      -- Press any key to exit (Input "c" to continue) --

----------ここまで---------
こんな感じで出力されています。
ちゃんと出力されているような気がしますが、現在の出力と希望の出力を書いてみていただけませんか?

>リスト表示の関数部分に下記を追加すると最後に入力したリストは表示されますが、このプリント文は表示されません。
>printf("p%d\n", p);
表示されないプリント文はプログラム中ではコメントになってますけど、それは関係ないですか?





この投稿にコメントする

削除パスワード

No.22023

Re:自己構造体
投稿者---neko(2005/07/21 14:57:05)


ありがとうございます。

><pre>>こちらのサイトの自己構造体をコンパイルしてみましたが、
>http://www9.plala.or.jp/sgwr-t/c/sec15-5.html
>このページのプログラムですか?

そうです。

>プログラムを貼り付けるときは必ず「HTML変換ツール」を使ってください。
>読めないです。
>あと自己参照構造体が正しいです。

すみませんでした。

>こんな感じで出力されています。

234 aaa
が表示されていません。

>ちゃんと出力されているような気がしますが、現在の出力と希望の出力を書いて>みていただけませんか?

123 kkk
234 aaa
両方表示されることが希望の出力です。

>リスト表示の関数部分に下記を追加すると最後に入力したリストは表示されますが、このプリント文は表示されません。
表示されないプリント文はプログラム中ではコメントになってますけど、それは関係ないですか?

コメントをはずすと
234 aaa
123 kkk
がちゃんと表示されます。
しかし、
123 kkkの方のprint文自体表示されません。

お手数ですが、よろしくお願いします。




この投稿にコメントする

削除パスワード

No.22027

Re:自己構造体
投稿者---あかま(2005/07/21 17:33:26)


載っているプログラムの実行結果
>キーと名前(MAX:19文字)を入力(終了:CTRL+Z)
>123 kkk
>234 aaa
>^Z
>234 aaa←これ
>123 kkk
表示されている

投稿されたプログラムのほう
>リストの表示9447872234 abc←これ
>1232 kkk

両方とも逆順になっていますが、表示されています。
それともこれではないのしょうか?




この投稿にコメントする

削除パスワード

No.22030

Re:自己構造体
投稿者---shu(2005/07/21 17:58:54)


>こちらのサイトの自己構造体をコンパイルしてみましたが、
>最後に入力したものが表示されません。
>なぜでしょうか?

自己参照構造体は、この際関係ありません。
ループをCtrl + Zで抜けたとき、Borland C++ 5.5.1で起こる現象です。

while (scanf("%d %s", &key, name) != EOF) {
    /* リストにデータを登録 */
    head = add_list(key, name, head);
}
putchar('\n');
printf("リストの表示%d",head);


ループから抜けたところで、改行を出力することで、普通に表示できます。

……過去ログにも詳しい説明があったと思います。


この投稿にコメントする

削除パスワード

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