ページ 11

c言語 リストデータ構造 キュー スタック がわかりません

Posted: 2012年6月08日(金) 10:45
by mona
以下のリスト構造体ではメモリを確保するのにmallocを使用しています。
ですが、mallocを使わずにプログラムを考えたいのです。
(今後、マイコン等メモリ制限のある機器を作成したいため)
自分なりに調べた結果、「スタック」および「キュー」が引っかったので勉強をしましたが、どのようにソースを書けばいいのか分かりません。

参考にでもソースを教えていただけないでしょうか?
また、詳しく解説されている(初級と中級レベルそれぞれについて)サイトや書籍がありましたらそちらもお願いいたします。

コード:

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

#define NUMBER 3
#define NAME_MAX 20
#define WEEK_MAX 11


// 構造体の定義
struct node {
	char name[NAME_MAX];      // 名前
	int  month;       		     // 月
	int  day;		   		 // 日
	char week[WEEK_MAX];     // 週
	struct node *next; // nodeへのポインタ
} ;

// 配列
struct node data[]={
		{ "riri",  3, 5, "fir" },
		{ "hara", 4, 6, "san" },
		{ "maka",  3, 5, "thu" }
};

// リストに要素を追加する
struct node* list_add( struct list* list, char n[], int m, int d, char w[] )
{
	// 新しい要素を作成
	struct node* node = ( struct node* )malloc( sizeof( struct node ) );
	
	strcpy( node->name,n );
	node->month = m;
	node->day   = d;
	strcpy( node->week, w );

	// 次の要素がないことを示すためにNULLを代入
	node->next = NULL;
	if( list == NULL ) 
	{
		// リストが空の場合は特別扱いする
		return node;
	}
	else 
	{
		// リストの末尾の要素を探す
		struct node* p = list;
		while( p->next != NULL ) 
		{
			p = p->next;
		}
		// ここで変数pは末尾の要素をさす
		p->next = node;
		return list;
	}
}

// 表示
void display( struct node* list )
{
	printf( "%s %d/%d %s \n",
			list->name, list->month, list->day, list->week );
	printf( "%s %d/%d %s \n",
			list->next->name, list->next->month, list->next->day, list->next->week );
	printf( "%s %d/%d %s \n",
			list->next->next->name, list->next->next->month, list->next->next->day, list->next->next->week );
}

int main( void )
{
	struct node* list = NULL;

	int i;
	for( i = 0; i < NUMBER; i ++ )
		list = list_add( list, data[i].name, data[i].month, data[i].day, data[i].week );

	display( list );

	return 0;
}

Re: c言語 リストデータ構造 キュー スタック がわかりません

Posted: 2012年6月08日(金) 11:44
by softya(ソフト屋)
マイコンでもメモリ制約が厳しく動的に複数のリストが変化するならmallocに類するの関数は自分で用意する必要があると思います。
もっと簡単に最大数が固定で確保したままで良いのなら配列でリスト、スタック、キューを表現することも出来ます。
あとリスト、スタック、キューはそれぞれ役割が違いますからそこを勉強して下さい。
それぞれ代用にはなりません。

「データ構造としての配列」
http://wwws.kobe-c.ac.jp/deguchi/c/array/frame.html
「ポインタを使ったデータ構造」
http://wwws.kobe-c.ac.jp/deguchi/c/list/frame.html
「アルゴリズムとデータ構造編 トップページ」
http://www.geocities.jp/ky_webid/algorithm/index.html
「アルゴリズムとデータ構造」
http://www.codereading.com/algo_and_ds/

[書籍]
「BohYoh.com【著書】新・明解 C言語によるアルゴリズムとデータ構造」
http://www.bohyoh.com/Books/NewMeikaiCAlgo/index.html

[補足]
今のプログラムならmallocせずに確保済みの配列から未使用な要素を割り当てる形する事は難しいことではありません。

Re: c言語 リストデータ構造 キュー スタック がわかりません

Posted: 2012年6月08日(金) 13:30
by mona
softyaさん。
ご指摘ありがとうございます。
最大数を固定し領域を確保する考えで表現したいと思いますが、もう一度リスト、スタック、キューの役割について勉強し直してきます。
サイトのご紹介ありがとうございました。