連結リスト

 firstpからリストを順にたどりデータを画面に表示する


  空リスト:
/* 連結リストを表示する */
#include <stdio.h>
#include <stdlib.h>

typedef	struct	node{
	int		data;
	struct node	*next;
} NODE, *Nodep;

void	displist(Nodep p);

Nodep	firstp;	/* 先頭ノードを指すポインタ */

main()
{
	/* [1, 5, 9] というリストを作成 */
	firstp = (Nodep)malloc(sizeof(NODE));
	firstp->data = 1;
	firstp->next = (Nodep)malloc(sizeof(NODE));
	firstp->next->data = 5;
	firstp->next->next = (Nodep)malloc(sizeof(NODE));
	firstp->next->next->data = 9;
	firstp->next->next->next = NULL;

	displist(firstp);
}

void	displist(Nodep p)
{
	printf("List");
	if( p == NULL )
	{
		printf(" is empty\n");
		return;
	}
	do
	{
		printf("%5d", p->data );
		p = p->next;
	} while(p);
	printf("\n");
}
/* end of llist1.c */

 firstからリストを順にたどりデータを画面に表示する


  空リスト:
/* 連結リストを表示する */
#include <stdio.h>
#include <stdlib.h>

typedef	struct	node{
	int		data;
	struct node	*next;
} NODE, *Nodep;

void	displist(Nodep fp);

NODE	first;	/* 先頭ノードを指すポインタを含むノード */

main()
{
	/* [1, 5, 9] というリストを作成 */
	first.next = (Nodep)malloc(sizeof(NODE));
	first.next->data = 1;
	first.next->next = (Nodep)malloc(sizeof(NODE));
	first.next->next->data = 5;
	first.next->next->next = (Nodep)malloc(sizeof(NODE));
	first.next->next->next->data = 9;
	first.next->next->next->next = NULL;

	displist(&first);
}

void	displist(Nodep fp)
{
	printf("List");
	if( fp->next == NULL )
	{
		printf(" is empty\n");
		return;
	}
	for( fp = fp->next ; fp != NULL; fp = fp->next )
	{
		printf("%5d", fp->data );
	}
	printf("\n");
}
/* end of llist2.c */

連結リストの基本操作をやってみよう!

  1. リストの先頭要素を削除する関数delhead(Nodep fp)を作成せよ。模範解答へ
  2. リストの末尾要素を削除する関数deltail(Nodep fp)を作成せよ。
  3. 以下のメニューを提示し、操作を選べるようにして、それぞれ実行するようにせよ。
     A:先頭要素の削除(delhead)
     B:末尾要素の削除(deltail)
     Q:リスト操作の終了(quit)
      この終了が選択されるまで、繰り返し選択して操作ができるようにせよ。
    ・全ての要素を削除したらどうなりますか?
    ・空のリストから要素を削除しようとしたらどうなりますか?
  4. 整数データ(val)を受け取り、新規ノードをリストの先頭に追加する関数addhead(Nodep fp, int val)を作成せよ。
  5. 整数データ(val)を受け取り、新規ノードをリストの末尾に追加する関数addtail(Nodep fp, int val)を作成せよ。
  6. 整数データ(val)がリストの中に有るか否かを判定する関数int find(Nodep fp, int val)を作成せよ。
  7. 以下のメニューを追加し、データをキー入力して、それぞれの操作を実行するようにせよ。
     C:先頭にデータ要素を追加(addhead)
     D:末尾にデータ要素を追加(addtail)
     E:リスト中にデータが有るか否か(find)
      有る時は「有ります。」、無い時は「無いです。」と画面に表示すれば良い。
  8. リストに対して上で実現した様々な操作を繰り返し、正しく実行されることを確かめよ。

1.リストの先頭要素の削除

 ポインタをどのように付け替えたら良いかを考えよう!

  空リスト:
/* リストの先頭要素を削除する */
#include <stdio.h>
#include <stdlib.h>

typedef	struct	node{
	int		data;
	struct node	*next;
} NODE, *Nodep;

void	displist(Nodep fp);
void	delhead(Nodep fp);

NODE	first;	/* 先頭ノードを指すポインタを含むノード */

main()
{
	/* [1, 5, 9] というリストを作成 */
	first.next = (Nodep)malloc(sizeof(NODE));
	first.next->data = 1;
	first.next->next = (Nodep)malloc(sizeof(NODE));
	first.next->next->data = 5;
	first.next->next->next = (Nodep)malloc(sizeof(NODE));
	first.next->next->next->data = 9;
	first.next->next->next->next = NULL;

	displist(&first);
	delhead(&first);
	/* [5, 9] というリストになっているはず */
	displist(&first);
}

void	displist(Nodep fp)
{
	printf("List");
	if( fp->next == NULL )
	{
		printf(" is empty\n");
		return;
	}
	for( fp = fp->next ; fp != NULL; fp = fp->next )
	{
		printf("%5d", fp->data );
	}
	printf("\n");
}

void	delhead(Nodep fp)
{
	Nodep	p;

	if( p = fp->next )
	{
		fp->next = fp->next->next;
		free(p);
	}
}
/* end of llist3.c */