連結リストについて

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

連結リストについて

#1

投稿記事 by asdjack » 12年前

連結リストの練習として、発生した乱数をdataに格納するリストを作成しているのですが、

コード:

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

typedef struct LIST
{
	int data;           /* 具体的なデータ */
	 LIST* next;  /* 次の要素へのポインタ */
}LIST;

 LIST header;//ダミーヘッド


void add (void) //リスト作成
{
	LIST *newcell,*p,*q;
	header.next=NULL;
	newcell = (LIST *)malloc(sizeof( LIST));
	if( newcell == NULL )
	{
		puts( "メモリ不足" );
		return;
	} 
		newcell->data =rand()%100;
		newcell->next =NULL;
	
	p = &header;
	while(p!=NULL)
	{
		p=p->next;
	}
	p->next=newcell;
}

void show()//表示関数
{
	LIST *p;
	p=&header;
	while(p!=NULL){
		printf("%d\n",p->data);
		p=p->next;
	}
}


int main(void)
{
	srand((int) time(NULL));
	int *p=(int*)malloc(sizeof(LIST));
	int i;
	for(i=0;i<100;i++)
	add();
	show();

}
ビルドは通るのですが、途中で書き込みエラーが出てしまいます。
どのあたりが間違っているのでしょうか?
教えてください。

box
記事: 2002
登録日時: 13年前

Re: 連結リストについて

#2

投稿記事 by box » 12年前

main()における変数pの存在理由がわかりません。

[ここから下はどうでもいい(かもしれない)話]
{ と } の位置関係や、=の前後の空白の開け方が首尾一貫していませんね。
また、インデントの仕方にも統一したポリシーがないようです。
書いているご本人は何とも思われないんでしょうか。

add()において、変数qは定義しただけで使ってないですね。不要では?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 連結リストについて

#3

投稿記事 by box » 12年前

それから、コードをザッと見ておかしそうだなと思うところは、
add()で、
asdjack さんが書きました:

コード:

	p = &header;
	while(p!=NULL)
	{
		p=p->next;
	}
	p->next=newcell;
こんな風に書かれていますが、while文のループを抜けるのはpがNULLになったときですよね。
そのとき、p->nextにアクセスするのは大いにまずいのではないでしょうか。

設計するときに図を描いていますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

asdjack
記事: 22
登録日時: 12年前

Re: 連結リストについて

#4

投稿記事 by asdjack » 12年前

コード:

void add (void)
{
	int i;
	LIST *newcell,*p,*q;
	header.next=NULL;
	for(i=0;i<3;i++)
	{
		newcell=(LIST *)malloc(sizeof( LIST));
		if( newcell==NULL )
			{
				puts( "メモリ不足" );
				return;
			} 
		newcell->data=rand()%100;
		newcell->next=NULL;
	
		p = &header;
		while(p!=NULL)
		{
				q=p;
				p=p->next;
		}
		q->next=newcell;
	}
}
ご指摘の通り p->nextにしていたのがおかしかったようです。
修正したらちゃんと動くようになりました。 
main()のpも不要だったので削除し、ループをmain()からadd()に移しました。
box さんが書きました: { と } の位置関係や、=の前後の空白の開け方が首尾一貫していませんね。
また、インデントの仕方にも統一したポリシーがないようです。
書いているご本人は何とも思われないんでしょうか。
ここに投稿する前に本やインターネットで参考にしたときに見よう見まねで書いてたので
書式が滅茶苦茶になっていたようです。
今後は気を付けるようにします。

閉鎖

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