配列を使ったリスト

C言語10課 データ構造とアルゴリズム編」

リストの機能

機能名 関数名 やること
初期化 init リストを空にする
先頭を求める top リストの先頭位置を返す
次の要素を求める next 次の要素位置を返す
要素数を求める count リストの要素数を求める
要素の値を求める item リストの要素を返す
追加 add リストの末尾に要素を追加する
挿入 insert 指定した位置に要素を挿入する
削除 delete リストから要素を削除する
/*
**	配列を使ったリスト
*/
#include <stdio.h>

#define	MAXSIZE	30		/* 配列のサイズ */

/* プロトタイプ */
void  init(void);
int   top(void);
int   next(int pos);
int   count(void);
int   item(int pos);
void  add(int value);
void  insert(int pos, int value);
void  delete(int pos);
void  showList(int list[]);

int   list[MAXSIZE];
int   tail;				/* リストの末尾 */

int main(void)
{
	int i;	/* カウンタ */

	init();

	puts("要素を追加!");
	for(i = 0 ; i < 5 ; i++){
		add(i + 1);
	}
	showList(list);
		
	puts("初期化!");
	init();
	showList(list);

	for(i = 1 ; i <= 3 ; i++){
	puts("要素を追加!");
	add(i);
	}
	showList(list);

	puts("先頭の要素を削除!");
	delete(top());
	showList(list);

	puts("要素(99)を先頭に挿入!");
	insert(top(), 99);
	showList(list);

	printf("listの要素数は%dです。\n", count());

	return 0;
}

/*
**	リストを初期化する
*/
void init(void)
{
	tail = 0;
}

/*
**	リストの先頭位置を返す
*/
int top(void)
{
	return 0;
}

/*
**	指定された位置の次の要素の位置を返す
*/
int next(int pos)
{
	if(pos < tail - 1){
		return pos + 1;
	}else{
		return -1;
	}
}

/*
**	要素数を返す
*/
int count(void)
{
	return tail;
}

/*
**	指定された位置にある要素を返す
*/
int item(int pos)
{
	if((0 <= pos) && (pos < tail)){
		return list[pos];
	}else{
		return 0;
	}
}

/*
**	要素を追加する
*/
void add(int value)
{
	if(tail < MAXSIZE){
		list[tail] = value;
		tail++;
	}
}

/*
**	要素を指定した位置に挿入する
*/
void insert(int pos, int value)
{
	if((0 <= pos) && (pos < tail) && (tail < MAXSIZE)){
		int i;	/* カウンタ */
				
		for(i = tail ; i > pos ; i--){
			list[i] = list[i - 1];
		}

		list[pos] = value;
		tail++;
	}
}

/*
**	要素を削除する
*/
void delete(int pos)
{
	if((0 <= pos) && (pos < tail)){
		int i;	/* カウンタ */
		for(i = pos ; i < tail ; i++){
				list[i] = list[i + 1];
		}
		tail--;
	}
}

/*
**	リストの中身を確認する
*/
void showList(int list[]){
	int i;
	printf("list={");
	for(i = top() ; i != -1 ; i = next(i)){
		if(i < tail - 1)
			printf("%d,", item(i));
		else
			printf("%d", item(i));
	}
	printf("}\n");
}

実行結果

要素を追加!
list={1,2,3,4,5}
初期化!
list={0}
要素を追加!
要素を追加!
要素を追加!
list={1,2,3}
先頭の要素を削除!
list={2,3}
要素(99)を先頭に挿入!
list={99,2,3}
listの要素数は3です。