C言語接続リスト1


ノードについて説明します.
<ノード構造で作成>
typedef struct node
{
	int number; //숫자를 저장하는 변수 
	struct node* p_next; // 다음 노드를 가르키는 포인터 
}NODE;
<新しいノードの追加>
NODE* p_head = NULL;
p_head = (NODE*)malloc(sizeof(NODE));
p_head->number = 12;
p_head->p_next = NULL;
  • ヘッダポインタをNULL値の初期値
  • に置き換える.
  • の新しいノードにメモリを割り当て、アドレス値をヘッダポインタに格納します.
  • ノードの番号には、値12が格納されます.->次のノードはありません.
  • <2番目のノードを追加した場合?>
    p_head = (NODE*)malloc(sizeof(NODE));
    p_head->p_next->number = 15;
    p_head->p_next->p_next = NULL;
    フェースノードメモリを2回割り当てます.
  • ノード番号の値に15を代入します.
  • には次のノードがありません.
  • <繰り返し文を使用して接続リストの最後のノードを参照します.>
    NODE* p = p_head;
    while (NULL != p->p_next)
    {
         p = p->p_next;
    }
  • pヘッダに格納されているアドレス値から、最初のノードのアドレス値が格納される.
  • p nextがNULLになるまで繰り返します.
  • <実装接続リスト関数>
  • 接続リストに新しいノードを追加し、temp変数に渡された数値を新しい追加ノードの番号
  • に保存します.
    void AddLinkedlist(NODE** pp_head, int temp) //2차원 포인터를 선택한 이유는 p_head 포인터 변수와 주소 값을 넘겨 받아야하고, 1차원 포인터의 주소 값을 받아서 사용해야된다.
    
    {
    	NODE* p;
    	if (NULL != *pp_head) // 여기서 *pp_head는 이전에 p_head값과 동일하다. 
    	{
    		p = *pp_head;
    		while (NULL != p->p_next) p = p->p_next; // 마지막 노드를 찾기 위해서 p_next가 NULL일 때 까지 반복한다.
    		p->p_next = (NODE*)malloc(sizeof(NODE)); // 새 노드를 위한 메모리를 할당한다.
    		p = p->p_next; // 새로 만든 노드의 주소 값을 p에 넣는다.
    	}
    	else {
    		*pp_head = (NODE*)malloc(sizeof(NODE));//새 노드 메모리를 할당한다.
    		p = *pp_head; // 새로 만든 주소 값을 p에 대입한다.
    	
    	}
    
    	p->number = temp; // 새 노드 number에 temp를 대입한다.
    	p->p_next = NULL; //다음 노드가 없다
    }
    <接続リストの最後のノード>
    void addfuction(NODE** pp_head, NODE** pp_tail, int number)//tail를 이용한 함수
    {
    	//tail를 추가함으로써 while(NULL != *pp_head) x tail이라는 마지막 노드를 설정하고 그것이 p_next를 가리키게 설정한다.
    	if (NULL != *pp_head)
    	{
    		*pp_tail->p_next = (NODE*)malloc(sizeof(NODE));//메모리를 할당해라
    		*pp_tail = (*pp_tail)->p_next;
    	}
    	else
    	{
    		*pp_head = (NODE*)malloc(sizeof(NODE));
    		*pp_tail = (*pp_head);
    	}
    
    	*pp_tail->number = data; // 새 노드의 number에 data값 명시
    	*pp_tail->p_next = NULL; //다음 노드가 없음을 명시한다.
    
    }
  • *pp tailというエンドポイントが追加されました.最後のノードを追加することでwhile文の使用を回避できます.
  • <ノードの削除>
    NODE* p = p_head, * p_save;
    while (NULL != p)
    {
    	p_save = p->p_next; // p_save에 값을 넣는 역할을 한다.
    	free(p);
    	p = p_save;
    }
    p_head = p_tail = NULL; //시작노드와 끝 노드가 없다는 것을 명시한다.
    <ノードの削除(ヘッドポインタを使用)>
    NODE* p;
    while (NULL != p_head)
    {
    	p = p_head->p_next;
    	free(p);
    	p_head = p;
    }
    p_tail = p_head; //반복문을 빠져 나오면 p_head값은 NULL이다. p_tail 값도 NULL로 변경한다.