1~11を表示する線形リスト

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

1~11を表示する線形リスト

#1

投稿記事 by じゃみ » 2年前

YouTubeにある「線形リストを作る」という動画を参考にして、1~11までを表示するリストを作ったのですが
コンパイルすると先頭のデータの1がずっと表示されて処理が終わりません。
リストとして表示するにはどのようにすればいいでしょうか?

よろしくお願いします

コード:

#include <stdio.h>

typedef struct list
{
	struct list *next;
	int data;
}List;	

int main(void)
{
	List node11 = {NULL, 11};
	List node10 = {&node11, 10};
	List node9 = {&node10, 9};
	List node8 = {&node9, 8};
	List node7 = {&node8, 7};
	List node6 = {&node7, 6};
	List node5 = {&node6, 5};
	List node4 = {&node5, 4};
	List node3 = {&node4, 3};
	List node2 = {&node3, 2};
	List node1 = {&node2, 1};


	List *head = &node1;
	List *p;

	for(p = head; p != NULL; p -> next)
	{
		printf("%d ", p -> data);
	}
	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 1~11を表示する線形リスト

#2

投稿記事 by みけCAT » 2年前

ループ内で p の値を更新していないですね。

p -> next を、 p = p -> next とするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

じゃみ
記事: 6
登録日時: 2年前

Re: 1~11を表示する線形リスト

#3

投稿記事 by じゃみ » 2年前

みけACTさん

ありがとうございます。
参考にした動画を見てみたら、ご指摘の通り p = p -> next になってましたね・・・
ケアレスミスでした、申し訳ないです。

じゃみ
記事: 6
登録日時: 2年前

追記:線形リストの生成を簡略化したい: 1~11を表示する線形リスト

#4

投稿記事 by じゃみ » 2年前

1~11を表示する線形リストにおいて
リスト生成とheadのポインタ(main(void){ から List *p; まで)を構造体の配列を使って

コード:

	List listdata[] = {
		{&listdata[1], 1},
		{&listdata[2], 2},
		{&listdata[3], 3},
		{&listdata[4], 4},
		{&listdata[5], 5},
		{&listdata[6], 6},
		{&listdata[7], 7},
		{&listdata[8], 8},
		{&listdata[9], 9},
		{&listdata[10], 10},
		{NULL, 11},
	};
	List *head = &listdata[0];
として昇順でコードを書けたのですが、
ループを使ってもっと簡略化したい場合、どのように書けばいいでしょうか?
試しに

コード:

	List listdata[10];

	for(int i = 0; i < 10; i++)
	{
		listdata[i] = {&listdata[i + 1], 1 + i};
	}
	listdata[10] = {NULL, 11};
として書くとエラーになりアイデアが思い浮かびません。
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 1~11を表示する線形リスト

#5

投稿記事 by みけCAT » 2年前

compound literal を使うといいでしょう。
また、配列の要素は十分な数確保しないといけません。
【C言語】複合リテラル【完全解説、生存期間、注意点、構造体/配列リテラル】 | MaryCore

コード:

	List listdata[11];

	for(int i = 0; i < 10; i++)
	{
		listdata[i] = (List){&listdata[i + 1], 1 + i};
	}
	listdata[10] = (List){NULL, 11};
また、メンバに対し1個ずつ代入する方法もあります。

コード:

	List listdata[11];

	for(int i = 0; i < 10; i++)
	{
		listdata[i].next = &listdata[i + 1];
		listdata[i].data = 1 + i;
	}
	listdata[10].next = NULL;
	listdata[10].data = 11;
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

じゃみ
記事: 6
登録日時: 2年前

Re: 1~11を表示する線形リスト

#6

投稿記事 by じゃみ » 2年前

みけCATさん

ご回答ありがとうございます。前回の返信でみけCATさんの名前を間違えてしまい申し訳ないですm(_ _)m
複合リテラルというものがあるんですね、初耳でした。。。
forループで構造体の各メンバに代入する方法でなかなか i の使い方が思い浮かばなかったので大変参考になりました。
また、構造体の配列の最後の要素 Listdata[10]も if 文を使って for ループに入れてみまして・・・。

コード:

	List listdata[11];

	for(int i = 0; i < 11; i++)
	{
		if(i < 10)
		{
			listdata[i].next = &listdata[i + 1];
			listdata[i].data = 1 + i;
		}
		else
		{
			listdata[10].next = NULL;
			listdata[10].data = 1 + i;
		}
	}
上のコードでもコンパイルでき、新たな発見ができました。
ありがとうございました。

返信

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