前提・実現したいこと
線形リストの昇順にソートされる挿入関数を以下の図のように作成する上で、関数insert1は
ノードを先頭に挿入するか否かで場合分けをするように作成し、
一方の関数insert2はその場合を分けをなくすためにダブルポインタを用いて作成するのですが、以下の空欄のあ〜きに入る式、特にお〜きがわかりません。
また,それ以前にinsert2のmain関数において
list *head = NULL;
と定義しているのに対し,
insert2の関数の引数ではダブルポインタ
void insert2(list **head_p, ...)
とあるのでmainで定義するのは合致するようにダブルポインタを用いなくていいのでしょうか?
また, mainで引数でinsert(&head,...)とありますが、これはポインタが指しているアドレスではなく、ポインタ自身のアドレスを渡している意味がわかりません。
ググったのですが, ダブルポインタを用いた線形リストの参考になるサイトが見当たらなかったのでよろしくお願いいたします。
該当のソースコード
C
1typedef struct list { 2 int data; 3 struct list *next; 4} list 5 6list * list_alloc(int data) { 7 list *p = malloc(sizeof(list)); 8 p->data = data; 9 p->next = NULL; 10 return p; 11} 12 13list * insert1(list *head, int data) { 14 list *new = list_alloc(data); 15 list *p = head; 16 if( あ || い ) { //先頭に挿入する条件 17 new->next = p; 18 return new; 19 } else { 20 while( う && え ) { //挿入箇所を探す 21 p = p->next; 22 } 23 new->next = p->next; 24 p->next = new; 25 return head; 26 } 27} 28 29int main() { 30 list *head = NULL; 31 head = insert1(head,100); 32 head = insert1(head,50); 33 head = insert1(head,20); 34}
C
1void insert2(list ** head_p, int data) { 2 list * new = list_alloc(data); 3 list **p = head_p; 4 while( お && か ) { 5 p = き; //次のnextメンバーを指す 6 } 7 new->next = *p; 8 *p = new; 9} 10int main() { 11 list *head = NULL; 12 insert2(&head,100); 13 insert2(&head,50); 14 insert2(&head,20); 15} 16
試したこと
まず、"あ"と"い"は先頭が空リストの場合と値が昇順になることを考えて
(p=NULL || data > p->data)
(p=NULL || data < p->data)
次の"う"と"え"は
while(p->next != NULL && data < p->next->data)
while(p->next != NULL && data > p->next->data)
でいいと思うのですが次の"か"と"き"を考える上でinsert2関数内の
list **p = head_p;
とありますが, このhead_pの値はリストの先頭のアドレスを指しているのでしょうか?
**追記: *間接メンバー"->"は選択演算、アドレス演算&より優先順位が高いことを考慮して,
"お"、"か"はそれぞれ
while(*p != NULL && data < (*p)->data)
であり、"き"は
p = &(*p)->next;
であると思うのですが、これは
p = **pと表記することも等しいと思うのですかどうなんでしょうか。
回答2件
あなたの回答
tips
プレビュー