한 걸음 한 걸음 알고리즘 (단 방향 링크)
3174 단어 데이터 구조 와 알고리즘
때때로 메모리 에 있 는 데 이 터 는 연속 적 인 것 이 아니다.그러면 이때 우 리 는 데이터 구조 에 속성 을 추가 해 야 한다. 이 속성 은 다음 데이터 의 주 소 를 기록 할 것 이다.이 주소 가 있 으 면 모든 데 이 터 는 하나의 체인 처럼 연결 되 고 이 주소 속성 은 선 을 꿰 어 연결 하 는 역할 을 합 니 다.
일반적인 선형 구조 에 비해 링크 구조의 장점 은 무엇 입 니까?우 리 는 총 결 해 볼 수 있다.
(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);
}
[예고: 다음 블 로 그 는 양 방향 링크 를 소개 합 니 다.]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JAVA] 배열 회전 출력요소 가 출력 을 시작 하 는 위치 에 주의 하 십시오. 모두 몇 라운드 의 수출 이 있 습 니까? n/2 + 1 매 라 운 드 는 상, 우, 하, 좌 로 나 뉜 다. 각 방향의 시작 위치 와 좌표 의 관 계 를 구...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.