단일 체인 테이블 및 그 기본 조작 (C 언어 구현)
typedef struct Node
{
DataType data; //
struct Node *next; //
}LNode,*PNode;
단일 체인 표 의 초기 화 를 할 때 헤드 노드 의 데이터 도 메 인 을 비 울 수도 있 고 그 안에 데 이 터 를 넣 을 수도 있다. 그러면 두 가지 서로 다른 단일 체인 표 가 있다. 두 가지 단일 체인 표 의 조작 을 바탕 으로 어느 정도 차이 가 있 고 헤드 노드 데이터 도 메 인 이 비어 있 을 때 후계 노드 나 다른 조작 을 방문 해도 헤드 포인터 의 방향 을 바 꾸 지 않 는 다.아래 의 조작 은 두절 점 데이터 영역 이 비어 있 지 않 은 단일 체인 표를 바탕 으로 진행 된다.
PNode LinkList; //
void Init_List(PNode *PHead) // PHead
{
assert(PHead);
*PHead = NULL; //
}
PNode Set_Node(DataType data) //
{
PNode Node = (PNode)malloc(sizeof(LNode));
if (NULL == Node)
{
perror("out of memory");
return NULL;
}
else
{
Node->data = data;
Node->next = NULL;
}
return Node; //
}
void Push_Back(PNode *PHead,DataType data) // ,
{
assert(NULL != PHead);
if (*PHead == NULL)
{
*PHead=Set_Node(data); //
}
else
{
PNode TmpNode = *PHead;
while (TmpNode->next != NULL)
{
TmpNode = TmpNode->next; //
}
TmpNode->next = Set_Node(data);
}
}
void Pop_Back(PNode *PHead) //
{
PNode TmpNode = NULL;
PNode PreNode = NULL;
assert(NULL != PHead);
if (NULL == *PHead)
{
return;
}
TmpNode = *PHead;
PreNode = *PHead;
while (TmpNode->next != NULL)
{
PreNode = TmpNode;
TmpNode = TmpNode->next; //
}
PreNode->next = NULL;
free(TmpNode);
}
void Push_Front(PNode* pHead, DataType data) //
{
assert(pHead);
if (NULL == *pHead)
{
*pHead = Set_Node(data);
}
else
{
PNode TmpNode = *pHead;
*pHead = Set_Node(data);
(*pHead)->next = TmpNode;
}
}
void Pop_Front(PNode* pHead) //
{
assert(pHead);
if (*pHead == NULL)
{
return;
}
else
{
PNode TmpNode = *pHead;
*pHead = (*pHead)->next;
free(TmpNode);
}
}
void Print_List(PNode Head) //
{
PNode TmpNode = NULL;
assert(NULL != Head);
TmpNode = Head;
while (TmpNode != NULL)
{
printf("%d->", TmpNode->data);
TmpNode = TmpNode->next;
}
printf("NULL");
printf("
");
}
PNode Find(PNode pHead, DataType data) // data
{
PNode TmpNode = NULL;
assert(pHead);
TmpNode = pHead;
while (TmpNode->data != data)
{
if (TmpNode->next != NULL)
{
TmpNode = TmpNode->next;
}
else
{
return NULL;
}
}
return TmpNode;
}
void Insert(PNode* pHead, PNode pos, DataType data) // (pos)
{
PNode TmpNode = NULL;
PNode PreNode = NULL;
assert(pHead);
if (*pHead == NULL)
{
return;
}
TmpNode = *pHead;
if (TmpNode == pos)
{
Push_Front(&(*pHead), data); //
return;
}
while (TmpNode->next != pos)
{
if (TmpNode->next != NULL)
{
TmpNode = TmpNode->next;
PreNode = TmpNode->next;
}
else
{
return; //pos
}
}
TmpNode->next = Set_Node(data);
TmpNode->next->next= PreNode;
}
void Erase(PNode* pHead, PNode pos) // (pos)
{
PNode TmpNode = NULL;
PNode PreNode = NULL;
assert(pHead);
if (*pHead == NULL)
{
return;
}
TmpNode = *pHead;
if (*pHead == pos) //pos
{
*pHead = NULL;
free(TmpNode);
return;
}
PreNode = TmpNode->next;
while (TmpNode->next!= pos)
{
if (TmpNode->next != NULL)
{
TmpNode = TmpNode->next;
PreNode = TmpNode->next;
}
else
{
return; //pos
}
}
TmpNode->next = PreNode->next;
free(PreNode);
}
void RemoveAll(PNode* pHead, DataType data) // data
{
assert(pHead);
if (*pHead == NULL)
{
return;
}
while (Find(*pHead ,data)!=NULL)
{
Remove(&(*pHead), data);
}
}
void Remove(PNode *Phead, DataType data) // data
{
assert(Phead);
if (*Phead == NULL)
{
return;
}
Erase(&(*Phead), Find(*Phead, data)); //
}
void RemoveAll(PNode* pHead, DataType data) // data
{
assert(pHead);
if (*pHead == NULL)
{
return;
}
while (Find(*pHead ,data)!=NULL)
{
Remove(&(*pHead), data); //
}
}
int Length(PNode PHead) //
{
int count = 0;
PNode pCurNode = PHead;
if (PHead == NULL)
{
return 0;
}
while (pCurNode != NULL)
{
count++;
pCurNode = pCurNode->next;
}
return count;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.