ページ 1 / 1
ポインタを利用したプログラム
Posted: 2015年10月01日(木) 22:06
by sim
コード:
#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;
}
こんばんわ。いつもお世話になっています。
このプログラムはポインタを使って、リストを出力します。
入力された数値が入力順に出力されるプログラムがわかりません。*逆にするのはできました。
なお、/**/の部分だけを変更して作りたいです。お願いします。
Re: ポインタを利用したプログラム
Posted: 2015年10月01日(木) 22:28
by みけCAT
リストの末尾の位置を保存し、そこに入力されたデータを追加していくのが素直で簡単、効率も悪くないでしょう。
コード:
#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;
}
Re: ポインタを利用したプログラム
Posted: 2015年10月01日(木) 22:47
by Poco
みけ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)
}
Re: ポインタを利用したプログラム
Posted: 2015年10月01日(木) 22:51
by みけCAT
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);
}
Re: ポインタを利用したプログラム
Posted: 2015年10月01日(木) 23:16
by Poco
みけCAT さんが書きました:
このコードは間違っています。
最初の実行時に、12行目で(NULL)->nextにアクセスすることになります。
Oops...
ご指摘ありがとうございます。
危うくウソ教えるところでした^^;
Re: ポインタを利用したプログラム
Posted: 2015年10月01日(木) 23:25
by sim
リストの末尾を保存した状態で、新しいnodeを更新していくわけですね。
ありがとうございます。