데이터 구조 입문: 앞장 서서 순환 하 는 양 방향 링크 의 실현
구조 가 복잡 하지만 코드 실현 은 간단 하 다
구체 적 인 코드 는 다음 과 같다.
typedef int LTDataType;
typedef struct ListNode{
LTDataType _data;
struct ListNode* _next;
struct ListNode* _prev;
}ListNode;
typedef struct List{
ListNode* _head;
}List;
/
void ListInit(List* plist){
assert(plist);
plist->_head = (ListNode*)malloc(sizeof(ListNode));
plist->_head->_data = 0;
plist->_head->_prev = plist->_head;
plist->_head->_next = plist->_head;
}
/ ( )
void ListDestory(List* plist){
assert(plist->_head);
ListNode* cur = plist->_head;
ListNode* eNode = plist->_head->_prev;
ListNode* tNode = NULL;
while (cur != eNode){
tNode = cur->_next;
free(cur);
cur = tNode;
}
free(eNode);
eNode = NULL;
plist->_head = NULL;
}
/ ,
/ ,
ListNode* BuyNode(LTDataType x){
ListNode* newNode = malloc(sizeof(ListNode));
assert(newNode);
newNode->_data = x;
newNode->_next = NULL;
newNode->_prev = NULL;
return newNode;
}
/
void ListPushBack(List* plist, LTDataType x){
assert(plist->_head);
ListNode* eNode = plist->_head->_prev;
ListNode* newNode = BuyNode(x);
assert(newNode);
eNode->_next = newNode;
newNode->_prev = eNode;
newNode->_next = plist->_head;
plist->_head->_prev = newNode;
}
/
void ListPopBack(List* plist){
assert(plist->_head);
if (plist->_head->_next == plist->_head){
return;
}
else{
ListNode* eNode = plist->_head->_prev->_prev;
free(plist->_head->_prev);
eNode->_next = plist->_head;
plist->_head->_prev = eNode;
}
}
/
void ListPushFront(List* plist, LTDataType x){
assert(plist->_head);
ListNode* newNode = BuyNode(x);
assert(newNode);
ListNode* tNode = plist->_head->_next;
plist->_head->_next = newNode;
newNode->_prev = plist->_head;
newNode->_next = tNode;
tNode->_prev = newNode;
}
/
void ListPopFront(List* plist){
assert(plist->_head);
if (plist->_head->_next == plist->_head){
return;
}
else{
ListNode* tNode = plist->_head->_next->_next;
free(plist->_head->_next);
plist->_head->_next = tNode;
tNode->_prev = plist->_head;
}
}
ListNode* ListFind(List* plist, LTDataType x){
assert(plist->_head);
ListNode* tNode = plist->_head;
if (tNode->_next == plist->_head){
return -1;
}
while (tNode->_next != plist->_head){
if (tNode->_data == x){
return tNode;
}
else{
tNode = tNode->_next;
}
}
return -1;
}
/pos ListFind
/ pos
void ListInsert(List* plist,ListNode* pos, LTDataType x){
assert(plist->_head);
if (pos == -1){
return -1;
}
ListNode* bNode = pos->_prev;
ListNode* newNode = BuyNode(x);
assert(newNode);
bNode->_next = newNode;
newNode->_prev = bNode;
newNode->_next = pos;
pos->_prev = newNode;
}
/ pos (pos )
void ListErase(List* plist, ListNode* pos){
assert(plist->_head);
if (pos == -1){
return -1;
}
ListNode* bNode = pos->_prev;
ListNode* eNode = pos->_next;
free(pos);
bNode->_next = eNode;
eNode->_prev = bNode;
}
void ListRemove(List* plist, LTDataType x){
assert(plist->_head);
ListNode* tNode = plist->_head->_next;
while (tNode != plist->_head){
if (tNode->_data == x){
ListNode* bNode = tNode->_prev;
ListNode* eNode = tNode->_next;
free(tNode);
bNode->_next = eNode;
eNode->_prev = bNode;
return;
}
else{
tNode = tNode->_next;
}
}
}
void ListPrint(List* plist){
assert(plist->_head);
ListNode* tNode = plist->_head;
while (tNode->_next != plist->_head){
printf("%d<=>", tNode->_data);
tNode = tNode->_next;
}
/ ,tNode
printf("%d<=>", tNode->_data);
printf("
");
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.