ポインタを利用したプログラム

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

ポインタを利用したプログラム

#1

投稿記事 by sim » 9年前

コード:

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

/*構造体の宣言*/
struct node
{
	int data;
	struct node *next;
};

int main(void)
{
	/*変数宣言*/
	struct node *start, *p;
	int d;
	
	/*リストを初期化する*/
	start = NULL;
	
	/*データを入力する*/
	printf("Input Number : ");
	scanf("%d",&d);
	
	/*リストを作成する*/
	while(d > 0)
	{	
		/*
                p=start;
		start = malloc(sizeof(struct node));
		start->data = d;
		start->next = p;
	
		 */
		 
		/*次のデータを入力する*/
		printf("Input Number : ");
		scanf("%d",&d);
	}
	
	/*リストを出力する*/
	printf("Result : ");
	for(p=start; p!=NULL; p=p->next)
	{
		printf("%d ", p->data);
	}
	printf("\n");
		
	return 0;
}

こんばんわ。いつもお世話になっています。
このプログラムはポインタを使って、リストを出力します。
入力された数値が入力順に出力されるプログラムがわかりません。*逆にするのはできました。
なお、/**/の部分だけを変更して作りたいです。お願いします。

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

Re: ポインタを利用したプログラム

#2

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

リストの末尾の位置を保存し、そこに入力されたデータを追加していくのが素直で簡単、効率も悪くないでしょう。

コード:

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

/*構造体の宣言*/
struct node
{
	int data;
	struct node *next;
};

int main(void)
{
	/*変数宣言*/
	struct node *start, *p;
	int d;
	
	/*リストを初期化する*/
	start = NULL;
	
	/*データを入力する*/
	printf("Input Number : ");
	scanf("%d",&d);
	
	/*リストを作成する*/
	while(d > 0)
	{	
		/* リストの末尾の位置を保存する変数の宣言 */
		static struct node **tail = NULL;
		/* リストの末尾の位置を初期化する */
		if (start == NULL) tail = &start;
		/* 新規ノードを作成する */
		p = malloc(sizeof(struct node));
		p->data = d;
		p->next = NULL;
		/* 新規ノードをリストの末尾に接続する */
		*tail = p;
		/* リストの末尾の位置を更新する */
		tail = &p->next;
		 
		/*次のデータを入力する*/
		printf("Input Number : ");
		scanf("%d",&d);
	}
	
	/*リストを出力する*/
	printf("Result : ");
	for(p=start; p!=NULL; p=p->next)
	{
		printf("%d ", p->data);
	}
	printf("\n");
		
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Poco
記事: 161
登録日時: 14年前

Re: ポインタを利用したプログラム

#3

投稿記事 by Poco » 9年前

みけCAT さんが書きました:

コード:

(snip)
	/*リストを作成する*/
	while(d > 0)
	{	
		/* リストの末尾の位置を保存する変数の宣言 */
		static struct node **tail = NULL;
		/* リストの末尾の位置を初期化する */
		if (start == NULL) tail = &start;
		/* 新規ノードを作成する */
		p = malloc(sizeof(struct node));
		p->data = d;
		p->next = NULL;
		/* 新規ノードをリストの末尾に接続する */
		*tail = p;
		/* リストの末尾の位置を更新する */
		tail = &p->next;
		 
		/*次のデータを入力する*/
		printf("Input Number : ");
		scanf("%d",&d);
	}
(snip)
ポインタのポインタ使うと難しくなりませんか?
#未コンパイルです

コード:

(snip)
	/*リストを作成する*/
	while(d > 0)
	{	
		/* リストの末尾の位置を保存する変数の宣言 */
		static struct node *tail = NULL;
		/* 新規ノードを作成する */
		p = malloc(sizeof(struct node));
		p->data = d;
		p->next = NULL;
		/* 新規ノードをリストの末尾に接続する */
		tail->next = p;
		/* リストの末尾の位置を更新する */
		tail = p;
		/* リストが空なら先頭の位置を更新する */
		if (start == NULL) start = tail;
		 
		/*次のデータを入力する*/
		printf("Input Number : ");
		scanf("%d",&d);
	}
(snip)	
}

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

Re: ポインタを利用したプログラム

#4

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

Poco さんが書きました:

コード:

(snip)
	/*リストを作成する*/
	while(d > 0)
	{	
		/* リストの末尾の位置を保存する変数の宣言 */
		static struct node *tail = NULL;
		/* 新規ノードを作成する */
		p = malloc(sizeof(struct node));
		p->data = d;
		p->next = NULL;
		/* 新規ノードをリストの末尾に接続する */
		tail->next = p;
		/* リストの末尾の位置を更新する */
		tail = p;
		/* リストが空なら先頭の位置を更新する */
		if (start == NULL) start = tail;
		 
		/*次のデータを入力する*/
		printf("Input Number : ");
		scanf("%d",&d);
	}
(snip)	
}
このコードは間違っています。
最初の実行時に、12行目で(NULL)->nextにアクセスすることになります。

修正案:

コード:

	/*リストを作成する*/
	while(d > 0)
	{	
		/* リストの末尾の位置を保存する変数の宣言 */
		static struct node *tail = NULL;
		/* 新規ノードを作成する */
		p = malloc(sizeof(struct node));
		p->data = d;
		p->next = NULL;
		if (start == NULL)
		{
			/* リストが空なら先頭の位置を更新する */
			start = tail = p;
		}
		else
		{
			/* 新規ノードをリストの末尾に接続する */
			tail->next = p;
			/* リストの末尾の位置を更新する */
			tail = p;
		}
		 
		/*次のデータを入力する*/
		printf("Input Number : ");
		scanf("%d",&d);
	}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Poco
記事: 161
登録日時: 14年前

Re: ポインタを利用したプログラム

#5

投稿記事 by Poco » 9年前

みけCAT さんが書きました: このコードは間違っています。
最初の実行時に、12行目で(NULL)->nextにアクセスすることになります。
Oops...
ご指摘ありがとうございます。
危うくウソ教えるところでした^^;

sim
記事: 48
登録日時: 10年前

Re: ポインタを利用したプログラム

#6

投稿記事 by sim » 9年前

リストの末尾を保存した状態で、新しいnodeを更新していくわけですね。
ありがとうございます。

閉鎖

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