ページ 11

連結リストを使ってキュー構造を作るプログラム

Posted: 2016年4月14日(木) 18:50
by po_po
enqueue(int i)はキューの末尾にiをもつ要素を挿入する関数で、dequeue()は先頭の要素を削除する関数、print()はリスト全てを表示させる関数です。
mainの操作をして結果を表示させたいのですが、コンパイルして実行するとセグメンテーション違反と出てしまいます。どこがおかしいのか教えて下さい。

コード:

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

typedef struct cell{
	int element;
	struct cell *next;
}cell;

cell *queue = NULL;

void enqueue(int i){
	cell *n = queue;
	cell *n2 = queue;
	cell *add = (cell *)malloc(sizeof(cell));
	while(n != NULL){
		n = n->next;
	}
	add->element = i;
	n2 = n;
	n = add;
	add->next = n2;
}

void dequeue(){
	queue = queue->next;
}
void print(){
	cell *n = queue;
	while(n != NULL){
		printf("%d\n ", n->element);
		n = n->next;
	}
}
	
int main(void)
{
	enqueue(5);
	enqueue(3);
	enqueue(6);
	dequeue();
	enqueue(3);
	enqueue(7);
	dequeue();
	print();
	
	return 0;
}

Re: 連結リストを使ってキュー構造を作るプログラム

Posted: 2016年4月14日(木) 19:16
by みけCAT
enqueue関数や他の部分でqueueを更新していないからqueueがNULLのままなのに、
dequeue関数のqueue->nextでqueue(=NULL)をデリファレンスしているので、アクセス違反が発生する可能性が高いです。
また、わざわざループを用いて実質nにNULLを代入しているのも不自然な仕様でしょう。
さらに、addの値が保存されていないので、enqueue関数はメモリリークを発生させます。
オフトピック
ちなみに、C言語においてはmalloc関数の戻り値(void*)は明示的にキャストするべきではないと言われています。