/* 連結リストを表示する */ #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 |
|