質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

2655閲覧

c言語の自己参照構造体についての質問です

makino

総合スコア32

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/10/22 12:43

下記のFILEから呼び込んだ文字列を、自己参照構造体に入れたいと思っています。
ちなみに2つのファイルに分けてあります。

ダンプしてみると、1回転目は動くのですが、2回転目から同じメモリを指し、上書きのような感じになってしまいます。
自己参照構造体についてよくわかっていないので申し訳ございませんが、
どこが原因なのか教えてください。
また、どうやって自己参照構造体は順番を管理するのかも知りたいです。
(2次元配列では何行目と指定できたので…)

メイン関数側。
extern int Structure(char *mojiyoko, int no);
extern char mojiyoko[30+1]; //文字列の入力用。

色々省略~

FILE *fp;

if ((fp = fopen("..\\..\\a.txt", "r")) == NULL){ printf("エラーメッセージを表示する\n"); exit(1); } no = 1; while ((fgets(&mojiyoko[0], 256, fp)) != NULL){ //構造体に入れる。 Structure(&mojiyoko[0], no); //構造体の関数呼び出し。 } fclose(fp);

ここから別ファイル。

char mojiyoko[30+1]; //文字列の入力用。

//構造体mojiRの宣言。
typedef struct mojiR{
char mojiyoko[31];
int dan; //上から何段目か。
struct mojiR *next;
}MojiR;

int Structure(char *mojiyoko, int no)
{
MojiR dmy = { "", 0, NULL }; //構造体の終端はNULL。初期化。
MojiR *start = NULL; //先頭管理用の構造体を指す。
MojiR *wk; //複数ある構造体の中で、処理をしている構造体を指す。
MojiR *ip; //ループカウンター

//構造体1個分のメモリの確保。 wk = (MojiR *)malloc(sizeof(MojiR)); if (wk == NULL){ //メモリの確保失敗。 exit(1); } memset(wk, 0, 31); //最初のファイルから受け取った、文字列のコピー strcpy(wk->mojiyoko, &mojiyoko[0]); //チェーンに、はめ込む動作。 for (ip = start; ip->next != NULL; ip = ip->next){ if (wk->dan < ip->next->dan){ //もし下の段より、段の番号が小さければ繋ぎかえる。 wk->next = ip->next; ip->next = wk; break; } } //もし最大値だった場合は、1番後ろにつける。 if (ip->next == NULL){ ip->next = wk; wk->next = NULL; } return 0;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

作成したノードが残るようにしないといけません。

まず、ループに入る前に、空のリストを作成しておきます。
Structure関数を呼び出すときに、空のリストの先頭のノードを渡します。

宣言はこのようになります。
int Structure(MojiR *start, char *mojiyoko, int no);
ローカル変数のMojiR *startを引数に持ってくる感じですね。

ループでなく1回ごとに呼ぶとしたらこんな感じです。
何度もmの下にどんどんつながっていきます。

lang

1int main() 2{ 3 struct mojiR m = { "", 0, NULL }; 4 5 Structure(&m, "word", 1); 6 Structure(&m, "rule", 2); 7 8 printf("1=%s, 2=%s\n", m.next->mojiyoko, m.next->next->mojiyoko); 9 // 1=word, 2=rule 10 11 return 0; 12}

どうやって自己参照構造体は順番を管理するのかも知りたいです。
(2次元配列では何行目と指定できたので…)

単方向リンクリストは、配列のようにランダムアクセスはできない構造です。

投稿2015/10/22 13:09

編集2015/10/22 14:07
argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makino

2015/10/22 13:47

回答ありがとうございます。 初心者で申し訳ないのですが、上の宣言をすると、MojiRのところに波線が出てきてしまいます。また、第一引数に何を渡すことになるんでしょうか?
argius

2015/10/22 14:09

メインのexternのプロトタイプ宣言と関数本体の両方を修正してください。 引数の渡し方は、回答を修正しましたので、そちらをご覧ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問