한 걸음 한 걸음 알고리즘 (단 방향 링크)

【 성명: 판권 소유, 전재 환영, 상업 용도 로 사용 하지 마 십시오. 연락처: feixiaoxixing @ 163. com]
    때때로 메모리 에 있 는 데 이 터 는 연속 적 인 것 이 아니다.그러면 이때 우 리 는 데이터 구조 에 속성 을 추가 해 야 한다. 이 속성 은 다음 데이터 의 주 소 를 기록 할 것 이다.이 주소 가 있 으 면 모든 데 이 터 는 하나의 체인 처럼 연결 되 고 이 주소 속성 은 선 을 꿰 어 연결 하 는 역할 을 합 니 다.
    일반적인 선형 구조 에 비해 링크 구조의 장점 은 무엇 입 니까?우 리 는 총 결 해 볼 수 있다.
    (1) 단일 노드 의 생 성 이 매우 편리 하고 일반적인 선형 메모 리 는 보통 생 성 할 때 데이터 의 크기 를 설정 해 야 한다.
    (2) 노드 의 삭제 가 매우 편리 하고 선형 구조 처럼 남 은 데 이 터 를 이동 할 필요 가 없다.
    (3) 노드 의 방문 이 편리 하고 순환 또는 재 귀 하 는 방법 으로 임 의 데 이 터 를 방문 할 수 있 으 나 평균 적 인 방문 효율 은 선형 표 보다 낮다.
    그렇다면 실제 응용 에서 체인 시 계 는 어떻게 디자인 되 었 습 니까?우 리 는 int 데이터 형식 을 바탕 으로 간단 한 int 링크 를 디자인 할 수 있 습 니 다.
    (1) 디자인 링크 의 데이터 구조
typedef struct _LINK_NODE
{
    int data;
	struct _LINK_NODE* next;
}LINK_NODE;

    
(2) 링크 만 들 기
LINK_NODE* alloca_node(int value)
{
    LINK_NODE* pLinkNode = NULL;
	pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE));
	
	pLinkNode->data = value;
	pLinkNode->next = NULL;
	return pLinkNode;
}

    (3) 링크 삭제
void delete_node(LINK_NODE** pNode)
{
    LINK_NODE** pNext;
    if(NULL == pNode || NULL == *pNode)
	    return ;
		
	pNext = &(*pNode)->next;
	free(*pNode);
	delete_node(pNext);	
}
    
(4) 링크 삽입 데이터
STATUS _add_data(LINK_NODE** pNode, LINK_NODE* pDataNode)
{
    if(NULL == *pNode){
	    *pNode = pDataNode;
		return TRUE;
	}
	
	return _add_data(&(*pNode)->next, pDataNode);
}

STATUS add_data(const LINK_NODE** pNode, int value)
{
    LINK_NODE* pDataNode;
    if(NULL == *pNode)
	    return FALSE;
		
	pDataNode = alloca_node(value);
	assert(NULL != pDataNode);
	return _add_data((LINK_NODE**)pNode, pDataNode);
}
    
(5) 데이터 삭제
STATUS _delete_data(LINK_NODE** pNode, int value)
{
    LINK_NODE* pLinkNode;
    if(NULL == (*pNode)->next)
	    return FALSE;
	
	pLinkNode = (*pNode)->next;
	if(value == pLinkNode->data){
	    (*pNode)->next = pLinkNode->next;
		free(pLinkNode);
		return TRUE;
	}else{
	    return _delete_data(&(*pNode)->next, value);
	}
}

STATUS delete_data(LINK_NODE** pNode, int value)
{
    LINK_NODE* pLinkNode;
    if(NULL == pNode || NULL == *pNode)
	    return FALSE;

    if(value == (*pNode)->data){
	    pLinkNode = *pNode;
		*pNode = pLinkNode->next;
		free(pLinkNode);
		return TRUE;
	}		
	
	return _delete_data(pNode, value);
}

    
(6) 데이터 찾기
LINK_NODE* find_data(const LINK_NODE* pLinkNode, int value)
{
    if(NULL == pLinkNode)
	    return NULL;
	
	if(value == pLinkNode->data)
	    return (LINK_NODE*)pLinkNode;
	
	return find_data(pLinkNode->next, value);
}
    
(7) 인쇄 데이터
void print_node(const LINK_NODE* pLinkNode)
{
    if(pLinkNode){
	    printf("%d
", pLinkNode->data); print_node(pLinkNode->next); } }
  
 
(8) 통계 데이터
int count_node(const LINK_NODE* pLinkNode)
{
    if(NULL == pLinkNode)
	    return 0;
		
	return 1 + count_node(pLinkNode->next);
}

[예고: 다음 블 로 그 는 양 방향 링크 를 소개 합 니 다.]

좋은 웹페이지 즐겨찾기