데이터 구조 양 방향 링크 의 추가 삭제 검사 (c 언어 구현)

//   +  +          
typedef int LTDataType;
typedef struct ListNode
{
	LTDataType _data;
	struct ListNode* _next;
	struct ListNode* _prev;
}ListNode;


1. 반환 링크 의 끝 점 만 들 기
ListNode* ListCreate()
{
	ListNode* head = (ListNode*)malloc(sizeof(ListNode));
	head->next = head;
	head->prev = head;
	return head;
}

2. 양 방향 링크 소각
//      
void ListDestory(ListNode* phead)
{
	ListNode* cur = phead->next;
	while (cur != phead)
	{
		ListNode* next = cur->next;
		free(cur);
		cur = next;
	}
	free(phead);
	phead = NULL;
}


3. 새로운 결산 점 을 동적 으로 신청 합 니 다.
ListNode* BuyListNode(LTDataType x)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
	newnode->data = x;
	newnode->next = NULL;
	newnode->prev = NULL;
	return newnode;
}

4. 양 방향 링크 인쇄
//      
void ListPrint(ListNode* phead)
{
	ListNode* cur = phead->next;
	while (cur != phead)
	{
		printf("%d", cur->data);
		cur = cur->next;
	}
	printf("
"); }

5. 양 방향 링크 꼬리 삽입
//      
void ListPushBack(ListNode* phead, LTDataType x)
{
	ListNode* newnode = BuyListNode(x);
	ListNode* tail = phead->prev;
	tail->next = newnode;
	newnode->prev = tail;
	newnode->next = phead;
	phead->prev = newnode;
}

6. 양 방향 링크 끝 삭제
//      
void ListPopBack(ListNode* phead)
{
	ListNode* tail = phead->next;
	ListNode* prev = tail->prev;
	free(tail);
	prev->next = phead;
	phead->prev = prev;
}


7. 양 방향 체인 헤드 삽입
//      
void ListPushFront(ListNode* phead, LTDataType x)
{
	ListNode* newnode = BuyListNode(x);
	ListNode* first = phead->next;
	phead->next = newnode;
	newnode->prev = phead;
	newnode->next = first;
	first->prev = newnode;
}

8. 양 방향 체인 헤더 삭제
//      
void ListPopFront(ListNode* phead)
{
	assert(phead->next != phead);
	ListNode* first = phead->next;
	ListNode* second = first->next;
	free(first);
	phead->next = second;
	second->prev = phead;
}

9. 양 방향 링크 찾기
//      
ListNode* ListFind(ListNode* phead, LTDataType x)
{
	ListNode* cur = phead->next;
	while (cur != phead)
	{
		if (cur->data == x)
			return cur;
		cur = cur->next;
	}
	return NULL;
}


10. 양 방향 링크 는 pos 앞에서 삽입 합 니 다.
//     pos       
void ListInsert(ListNode* pos, LTDataType x)
{
	ListNode* prev = pos->prev;
	ListNode* newnode = BuyListNode(x);
	prev->next = newnode;
	newnode->prev = prev;
	newnode->next = pos;
	pos->prev = newnode;
}

11. 양 방향 링크 에서 pos 위치의 결산 점 을 삭제 합 니 다.
//      pos     
void ListErase(ListNode* pos)
{
	ListNode* prev = pos->prev;
	ListNode*next = pos->next;
	free(pos);
	prev->next = next;
	next->prev = prev;
}

좋은 웹페이지 즐겨찾기