| /* 連結リストを表示する */
#include <stdio.h>
#include <stdlib.h>
typedef	struct	node{
	int		data;
	struct node	*next;
} NODE, *Nodep;
void	displist(Nodep fp);
Nodep	first_p;	/* 先頭ノードを指すポインタ */
main()
{
	/* [1, 5, 9] というリストを作成 */
	first_p = (Nodep)malloc(sizeof(NODE));
	first_p->data = 1;
	first_p->next = (Nodep)malloc(sizeof(NODE));
	first_p->next->data = 5;
	first_p->next->next = (Nodep)malloc(sizeof(NODE));
	first_p->next->next->data = 9;
	first_p->next->next->next = NULL;
	displist(first_p);
}
void	displist(Nodep fp)
{
	printf("List");
	if( fp == NULL )
	{
		printf(" is empty\n");
		return;
	}
	for( ; fp != NULL; fp = fp->next )
	{
		printf("%5d", fp->data );
	}
	printf("\n");
}
/* end of llist1.c */
 |   | 
| /* 連結リストを表示する */
#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 */
 |   | 
ポインタをどのように付け替えたら良いかを考えよう!
| 先頭ノードへのポインタ(first_p)版 | ヘッダノード(first)版 | 
|  |  | 
| Nodep *fpp; Nodep p;・・・2種類のポインタ | Nodep fp; Nodep p;・・・1種類のポインタ | 
| 
/*
Nodep	first_p;
	delhead(&first_p); // 関数呼び出し
*/
// リストの先頭要素を削除する関数
void	delhead(Nodep *fpp)
{
	Nodep	p;
	if( p = *fpp )
	{
		*fpp = p->next;
		free(p);
	}
}
 | 
/*
NODE	first;
	delhead(&first); // 関数呼び出し
*/
// リストの先頭要素を削除する関数
void	delhead(Nodep fp)
{
	Nodep	p;
	if( p = fp->next )
	{
		fp->next = p->next;
		free(p);
	}
}
 | 
| /* リストの先頭要素を削除する
 先頭ノードへのポインタ(first_p)版 */
#include <stdio.h>
#include <stdlib.h>
typedef	struct	node{
	int		data;
	struct node	*next;
} NODE, *Nodep;
void	displist(Nodep fp);
void	delhead(Nodep *fp);
Nodep	first_p;	/* 先頭ノードを指すポインタ */
main()
{
	/* [1, 5, 9] というリストを作成 */
	first_p = (Nodep)malloc(sizeof(NODE));
	first_p->data = 1;
	first_p->next = (Nodep)malloc(sizeof(NODE));
	first_p->next->data = 5;
	first_p->next->next = (Nodep)malloc(sizeof(NODE));
	first_p->next->next->data = 9;
	first_p->next->next->next = NULL;
	displist(first_p);
	delhead(&first_p);
	/* [5, 9] というリストになっているはず */
	displist(first_p);
	delhead(&first_p);
	/* [9] というリストになっているはず */
	displist(first_p);
	delhead(&first_p);
	/* empty リストになっているはず */
	displist(first_p);
	delhead(&first_p);
	/* empty リストのままのはず */
	displist(first_p);
}
void	displist(Nodep fp)
{
	printf("List");
	if( fp == NULL )
	{
		printf(" is empty\n");
		return;
	}
	for( ; fp != NULL; fp = fp->next )
	{
		printf("%5d", fp->data );
	}
	printf("\n");
}
void	delhead(Nodep *fpp)
{
	Nodep	p;
	if( p = *fpp )
	{
		*fpp = p->next;
		free(p);
	}
}
/* end of llist3.c */
 |   | 
| /* リストの先頭要素を削除する ヘッダノード(first)版 */ #include |   |